多线程待总结
java多线程编程实验总结与体会

java多线程编程实验总结与体会[Java多线程编程实验总结与体会]本次实验锻炼了我的Java多线程编程能力,让我更深入地了解了多线程编程的实现原理和技巧,同时也让我意识到在多线程环境下需要考虑的问题和注意事项。
下面我将结合具体实验内容,分享我在实践中的体会和思考。
1. 实验环境搭建在进行本次实验之前,我首先进行了实验环境的搭建。
我选择了Java SE Development Kit 8和Eclipse作为开发工具,同时也安装了JDK8的API 文档作为参考资料。
在搭建环境的过程中,我认识到Java的生态系统非常强大,附带的工具和资源也非常充足,这为我们开发和调试带来了很大的便利。
2. 多线程原理在研究多线程编程之前,我们需要对Java语言中的线程概念有一个清晰的认识。
线程是指操作系统能够进行运算调度的最小单位,是执行线程代码的路径。
在Java中,线程是一种轻量级的进程,可以同时运行多个线程。
每个线程都有自己的堆栈和局部变量,线程之间可以共享全局变量。
Java的多线程编程是通过Thread类和Runnable接口来实现的。
在实践中,我发现多线程编程最基本的原理是线程的并发执行。
多个线程可以在同一时间内执行不同的代码,提高CPU利用率,加快程序运行速度。
但是,在多线程并发执行的过程中,我们需要注意线程之间的同步问题,避免出现数据竞争和并发安全等问题。
3. 多线程的实现在Java中,我们可以通过继承Thread类或者实现Runnable接口来创建线程。
对于简单的线程,我们可以采用继承Thread类的方式来实现。
例如,在实验一中,我们在Main线程内创建了两个子线程,分别用来执行奇数和偶数的累加操作。
我们可以分别定义两个类OddThread和EvenThread继承Thread类,分别实现run()方法,用来执行具体的奇数和偶数累加操作。
然后在Main线程内创建OddThread和EvenThread 对象,并调用start()方法来启动两个线程,并等待两个线程完成操作。
多线程注意事项范文

多线程注意事项范文多线程是指在一个程序中同时运行多个线程,每个线程独立执行不同的任务。
相比单线程,多线程可以提高程序的执行效率和资源利用率。
然而,多线程编程也存在一些注意事项,下面将详细介绍:1.线程安全问题:多个线程同时访问共享的数据,可能引发竞态条件或死锁等问题。
为避免这些问题,可以采用锁、信号量、互斥量等机制来保护共享数据的访问。
2.同步问题:当多个线程并发执行时,可能会出现对共享资源的不同步访问。
为解决这个问题,可以使用线程同步机制,如条件变量、读写锁等,来保证多个线程按照特定的顺序访问共享资源。
3.上下文切换开销:切换线程间的上下文需要保存和恢复线程的状态信息,这会带来一定的开销。
因此,在多线程编程时,应避免频繁的线程切换,合理调度线程的执行顺序,以降低上下文切换的开销。
4.线程间通信问题:多个线程之间可能需要进行通信,传递数据或控制信息。
为确保线程间的正确通信,可以使用消息队列、管道、共享内存等机制来实现线程间的数据交换。
5.线程优先级问题:多线程环境中,线程的调度是由操作系统决定的,因此无法确定线程的执行顺序。
这就导致线程的执行结果可能与预期不符。
为避免这个问题,可以设置线程的优先级,提高重要线程的执行优先级。
6.死锁问题:多个线程之间的循环等待资源的释放,导致所有线程都无法继续执行,称为死锁。
为避免死锁问题,应避免循环等待的发生,可以按照特定的顺序申请和释放资源。
7.线程创建和销毁开销:创建和销毁线程需要消耗系统资源,因此应合理控制线程的数量,避免频繁的线程创建和销毁操作。
8.线程安全方法和非线程安全方法:在多线程环境中,一些方法可能是线程安全的,即多个线程同时调用不会引发竞态条件等问题。
而一些方法可能是非线程安全的,多个线程同时调用可能导致不确定的结果。
在多线程编程时,应注意选择线程安全的方法。
9.CPU资源的合理利用:多线程程序可能会占用过多的CPU资源,导致其他程序无法正常工作。
多线程处理:提升程序并发和响应能力的技巧

多线程处理:提升程序并发和响应能力的技巧多线程处理是一种提升程序并发和响应能力的重要技巧。
随着计算机的发展和处理器的不断升级,多核处理器成为主流,计算机拥有更多的处理单元,但是单个线程只能在一个处理单元上执行。
为了充分利用计算机资源,我们需要使用多线程技术。
多线程处理指的是在一个程序中同时运行多个线程,每个线程独立执行自己的任务。
通过多线程处理,可以实现同时处理多个任务,提升程序的并发能力和响应能力。
下面我将介绍一些多线程处理的技巧,以帮助提升程序的并发和响应能力。
1.合理划分任务:在设计多线程程序时,首先需要合理划分任务。
将一个大任务划分成多个小任务,并将这些小任务分配给不同的线程。
这样可以充分利用多核处理器的计算能力,并提高程序的并发能力。
2.线程池:线程池是一种管理和复用线程的机制。
通过线程池可以避免频繁地创建和销毁线程,提高线程的利用率。
线程池可以预先创建一定数量的线程,并将任务分配给空闲的线程来处理,当任务完成后,线程可以继续处理其他任务,而不需要销毁重新创建。
3.并发容器:并发容器是一种在多线程环境下安全访问的数据结构。
Java中提供了多种并发容器,如ConcurrentHashMap、ConcurrentLinkedQueue 等,可以在多线程环境下高效地操作数据。
使用并发容器可以避免多线程竞争导致的数据不一致和线程安全问题。
4.锁和同步机制:多线程是在共享的资源上进行操作,因此需要考虑线程安全问题。
在多线程程序中,使用锁和同步机制可以保证多线程之间的顺序和互斥。
Java中提供了synchronized关键字和Lock接口,可以实现线程的同步与互斥。
5.避免死锁:死锁是多线程编程中常见的问题,指的是多个线程因互相等待对方释放资源而陷入无限等待的状态。
为了避免死锁,需要合理设计线程之间的依赖关系和资源的请求顺序。
另外,还可以使用线程池和资源分配策略来减少死锁的发生。
6.异步编程:异步编程是一种非阻塞的编程方式,可以提高程序的响应能力。
多线程程序实验报告(3篇)

第1篇一、实验目的1. 理解多线程的概念和作用。
2. 掌握多线程的创建、同步和通信方法。
3. 熟悉Java中多线程的实现方式。
4. 提高程序设计能力和实际应用能力。
二、实验环境1. 操作系统:Windows 102. 开发工具:IntelliJ IDEA3. 编程语言:Java三、实验内容本次实验主要完成以下任务:1. 创建多线程程序,实现两个线程分别执行不同的任务。
2. 使用同步方法实现线程间的同步。
3. 使用线程通信机制实现线程间的协作。
四、实验步骤1. 创建两个线程类,分别为Thread1和Thread2。
```javapublic class Thread1 extends Thread {@Overridepublic void run() {// 执行Thread1的任务for (int i = 0; i < 10; i++) {System.out.println("Thread1: " + i);}}}public class Thread2 extends Thread {@Overridepublic void run() {// 执行Thread2的任务for (int i = 0; i < 10; i++) {System.out.println("Thread2: " + i);}}}```2. 创建一个主类,在主类中创建两个线程对象,并启动它们。
```javapublic class Main {public static void main(String[] args) {Thread thread1 = new Thread1();Thread thread2 = new Thread2();thread1.start();thread2.start();}```3. 使用同步方法实现线程间的同步。
```javapublic class SynchronizedThread extends Thread {private static int count = 0;@Overridepublic void run() {for (int i = 0; i < 10; i++) {synchronized (SynchronizedThread.class) {count++;System.out.println(Thread.currentThread().getName() + ": " + count);}}}}public class Main {public static void main(String[] args) {Thread thread1 = new SynchronizedThread();Thread thread2 = new SynchronizedThread();thread1.start();thread2.start();}```4. 使用线程通信机制实现线程间的协作。
java多线程程序设计实验总结

java多线程程序设计实验总结一、实验目的本次实验旨在通过编写Java多线程程序,掌握多线程编程的基本概念和技能,理解多线程程序的运行原理,提高对Java语言的熟练度。
二、实验内容本次实验分为三个部分:创建线程、线程同步和死锁。
2.1 创建线程创建线程有两种方式:继承Thread类和实现Runnable接口。
继承Thread类需要重写run方法,在run方法中编写线程执行的代码;实现Runnable接口需要实现run方法,并将其作为参数传入Thread类的构造函数中。
在创建多个线程时,可以使用同一个Runnable对象或者不同的Runnable对象。
2.2 线程同步当多个线程同时访问共享资源时,可能会出现数据不一致等问题。
为了避免这种情况,需要使用同步机制来保证各个线程之间的协调运行。
常见的同步机制包括synchronized关键字和Lock接口。
synchronized关键字可以用来修饰方法或代码块,在执行该方法或代码块时,其他所有试图访问该方法或代码块的线程都必须等待当前执行完成后才能继续执行。
Lock接口提供了更加灵活和高级的锁机制,可以支持更多种类型的锁,如读写锁、可重入锁等。
2.3 死锁死锁是指两个或多个线程在互相等待对方释放资源的情况下,都无法继续执行的现象。
死锁的发生通常由于程序设计不当或者资源分配不合理所导致。
为避免死锁的发生,可以采取以下措施:避免嵌套锁、按照固定顺序获取锁、避免长时间占用资源等。
三、实验过程本次实验我编写了多个Java多线程程序,包括创建线程、线程同步和死锁。
其中,创建线程部分我使用了继承Thread类和实现Runnable 接口两种方式来创建线程,并测试了多个线程之间的并行执行情况;在线程同步部分,我使用synchronized关键字和Lock接口来保证共享资源的访问安全,并测试了多个线程同时访问共享资源时是否会出现数据不一致等问题;在死锁部分,我编写了一个简单的死锁程序,并通过调整程序代码来避免死锁的发生。
JAVA多线程的使用场景与注意事项总结

JAVA多线程的使用场景与注意事项总结Java多线程是指在一个程序中同时运行多个线程,每个线程都有自己的执行代码,但是又共享同一片内存空间和其他系统资源。
多线程的使用场景和注意事项是我们在开发中需要关注的重点,下面将详细进行总结。
一、Java多线程的使用场景:1.提高程序的执行效率:多线程可以充分利用系统资源,将一些耗时的操作放到一个线程中执行,避免阻塞主线程,提高程序的执行效率。
2.实现并行计算:多线程可以将任务拆分成多个子任务,每个子任务分配给一个线程来执行,从而实现并行计算,提高计算速度。
3.响应性能提升:多线程可以提高程序的响应性能,比如在用户界面的开发中,可以使用多线程来处理用户的输入和操作,保证界面的流畅性和及时响应。
4.实时性要求高:多线程可以实现实时性要求高的任务,比如监控系统、实时数据处理等。
5.任务调度与资源管理:多线程可以实现任务的调度和资源的管理,通过线程池可以更好地掌控任务的执行情况和使用系统资源。
二、Java多线程的注意事项:1.线程安全性:多线程操作共享资源时,要注意线程安全问题。
可以通过使用锁、同步方法、同步块等方式来解决线程安全问题。
2.死锁:多线程中存在死锁问题,即多个线程相互等待对方释放资源,导致程序无法继续执行。
要避免死锁问题,应尽量减少同步块的嵌套和锁的使用。
3.内存泄漏:多线程中存在内存泄漏问题,即线程结束后,线程的资源没有得到释放,导致内存占用过高。
要避免内存泄漏问题,应及时释放线程资源。
4.上下文切换:多线程的切换会带来上下文切换的开销,影响程序的执行效率。
要注意合理分配线程的数量,避免过多线程的切换。
5. 线程同步与通信:多线程之间需要进行同步和通信,以保证线程之间的正确协调和数据的一致性。
可以使用synchronized关键字、wait(和notify(方法等方式进行线程同步和通信。
6.线程池的使用:在多线程编程中,可以使用线程池来管理线程的创建和销毁,可以减少线程的创建和销毁的开销,提高程序的性能。
线程实例实验报告总结
一、实验目的本次实验旨在通过实例操作,深入了解线程的概念、创建、同步与通信机制,以及线程在实际编程中的应用。
通过实验,提高对线程的理解和运用能力,为以后开发多线程程序打下坚实基础。
二、实验环境1. 操作系统:Windows 102. 开发工具:Visual Studio 20193. 编程语言:C#三、实验内容1. 线程的基本概念线程是程序执行的最小单位,是操作系统进行资源分配和调度的基本单位。
线程具有以下特点:(1)线程是轻量级的,创建、销毁线程的开销较小。
(2)线程共享进程的资源,如内存、文件等。
(3)线程之间可以并发执行。
2. 线程的创建在C#中,可以使用以下方式创建线程:(1)使用Thread类```csharpThread thread = new Thread(new ThreadStart(MethodName));thread.Start();```(2)使用lambda表达式```csharpThread thread = new Thread(() => MethodName());thread.Start();```(3)使用匿名方法```csharpThread thread = new Thread(delegate () { MethodName(); });thread.Start();```3. 线程的同步线程同步是指多个线程在执行过程中,为了防止资源冲突而采取的协调机制。
C#提供了以下同步机制:(1)互斥锁(Mutex)```csharpMutex mutex = new Mutex();mutex.WaitOne();// 线程同步代码mutex.ReleaseMutex();```(2)信号量(Semaphore)```csharpSemaphore semaphore = new Semaphore(1, 1);semaphore.WaitOne();// 线程同步代码semaphore.Release();```(3)读写锁(ReaderWriterLock)```csharpReaderWriterLock rwlock = new ReaderWriterLock();rwlock.AcquireReaderLock();// 读取操作rwlock.ReleaseReaderLock();```4. 线程的通信线程通信是指线程之间传递消息、共享数据的过程。
线程的互斥实验报告总结
线程的互斥实验报告总结
本次实验是关于线程互斥的,旨在通过使用互斥锁和信号量等机制,让学生能够更好地理解并掌握线程的互斥操作。
在本次实验中,我们首先学习了互斥锁的概念和使用方法。
互斥
锁是一种最常用的线程同步机制,用来保证多个线程之间的互斥操作。
通过使用互斥锁,我们可以避免两个或多个线程同时访问共享资源而
导致数据异常的问题。
实验中,我们对比了有互斥锁与没有互斥锁对
共享变量的访问结果,明显地看到了在没有互斥锁的情况下,数据会
发生异常。
除了互斥锁,我们还学习了信号量的概念和使用方法。
信号量是
一种用于控制访问共享资源的标志,在多线程程序中广泛应用。
使用
信号量可以保证多个线程间共享资源的安全性,并可以避免资源竞争
和死锁的发生。
在实验中,我们还利用信号量实现了线程的同步和互
斥操作。
通过本次实验,我深感互斥锁和信号量在多线程程序中的重要性。
在多线程编程中,不仅要考虑到线程之间的并发问题,也需要关注到
线程之间的同步和互斥操作。
只有将线程同步和互斥机制运用到多线
程编程中,才能真正保证多线程程序的安全性和正确性。
综上所述,本次实验对于我来说是非常有意义的。
通过学习互斥
锁和信号量等线程同步机制,我对于多线程编程的思想和技术又有了
更深刻的理解和认识。
我相信,在今后的学习和工作中,所学到的知识一定会给我带来更多的帮助和启示。
C#多线程文件读写整理总结
C#多线程⽂件读写整理总结多线程读写⽂件⼀直是⼀个⽐较常⽤的技术,普通的锁显得效率低下,和单线程感觉基本没有啥区别,这⾥参考了⼤⽜的代码,采⽤了线程池技术,⼩菜我⼀直不明⽩异步和多线程有啥区别,后来读了个⼤⽜的博客,才明⽩,为加强理解,抄袭⼀下吧,多线程相关名词概念的解释并发:在操作系统中,是指⼀个时间段中有⼏个程序都处于已启动运⾏到运⾏完毕之间,且这⼏个程序都是在同⼀个处理机上运⾏。
其中两种并发关系分别是同步和互斥互斥:进程间相互排斥的使⽤临界资源的现象,就叫互斥。
同步:进程之间的关系不是相互排斥临界资源的关系,⽽是相互依赖的关系。
进⼀步的说明:就是前⼀个进程的输出作为后⼀个进程的输⼊,当第⼀个进程没有输出时第⼆个进程必须等待。
具有同步关系的⼀组并发进程相互发送的信息称为消息或事件。
其中并发⼜有伪并发和真并发,伪并发是指单核处理器的并发,真并发是指多核处理器的并发。
并⾏:在单处理器中多道程序设计系统中,进程被交替执⾏,表现出⼀种并发的外部特种;在多处理器系统中,进程不仅可以交替执⾏,⽽且可以重叠执⾏。
在多处理器上的程序才可实现并⾏处理。
从⽽可知,并⾏是针对多处理器⽽⾔的。
并⾏是同时发⽣的多个并发事件,具有并发的含义,但并发不⼀定并⾏,也亦是说并发事件之间不⼀定要同⼀时刻发⽣。
多线程:多线程是程序设计的逻辑层概念,它是进程中并发运⾏的⼀段代码。
多线程可以实现线程间的切换执⾏。
异步:异步和同步是相对的,同步就是顺序执⾏,执⾏完⼀个再执⾏下⼀个,需要等待、协调运⾏。
异步就是彼此独⽴,在等待某事件的过程中继续做⾃⼰的事,不需要等待这⼀事件完成后再⼯作。
线程就是实现异步的⼀个⽅式。
异步是让调⽤⽅法的主线程不需要同步等待另⼀线程的完成,从⽽可以让主线程⼲其它的事情。
异步和多线程并不是⼀个同等关系,异步是最终⽬的,多线程只是我们实现异步的⼀种⼿段。
异步是当⼀个调⽤请求发送给被调⽤者,⽽调⽤者不⽤等待其结果的返回⽽可以做其它的事情。
多线程并发实验报告心得
多线程并发实验报告心得
一、实验介绍
本次实验是多线程并发实验,旨在通过编写多线程程序,掌握多线程编程的基本原理和技巧,并了解并发程序的运行机制。
二、实验环境
本次实验使用Java语言,在Eclipse开发环境下完成。
三、实验过程
1. 熟悉多线程编程的基本原理和技巧,包括线程的创建、启动、休眠等操作;
2. 编写多线程程序,模拟多个人同时购买火车票的场景;
3. 在程序中设置同步锁,保证只有一个人能够购买到票;
4. 运行程序,观察并发程序的运行机制。
四、实验结果
经过多次测试和调试,我们成功地编写出了一个模拟购票系统的多线程程序。
在运行过程中,我们观察到不同线程之间存在竞争关系,并且通过设置同步锁,保证了只有一个人能够成功购买到票。
五、心得体会
通过本次实验,我深刻地认识到了并发编程的重要性。
在日常开发中,很多应用都需要支持并发访问,在不加注意的情况下很容易出现资源
竞争等问题。
因此,在进行并发编程时,我们必须充分考虑并发访问
的可能性,并采取相应的措施来保证程序的正确性和稳定性。
同时,我也认识到了多线程编程的复杂性。
在编写多线程程序时,我
们需要考虑线程之间的协作关系、同步锁的设置、异常处理等问题,
这些都需要我们具备较高的编程技能和经验。
因此,在进行多线程编
程时,我们需要仔细思考,并且不断地积累经验。
最后,我认为本次实验对我的编程能力提升有很大帮助。
通过实践操作,我深入了解了多线程并发编程的原理和技巧,并且掌握了一些实
用的技巧和方法。
相信这些知识和经验将对我的日常开发工作产生积
极影响。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
多线程待总结线程的状态:1,创建状态、创建后,有了相应的内存空间和其他资源,但还处于不可运行状态。
2,就绪状态调用线程得start()方法就可以启动线程。
当线程启动,就进入了就绪状态。
此时线程进入队列排队,等待cpu服务,表明具有了运行条件。
3,运行状态、当就绪状态的线程被调用并获得处理器资源时,线程就进入了运行状态。
这时,自动掉用该线程对象的run()方法。
run()方法定义了该线程的操作和功能。
4,堵塞状态一个正在执行的线程,因为某些原因,让出cpu并暂时终止自己的执行,进入堵塞状态。
在可执行状态下,若调用sleep()、suspend()、wait()等方法,线程进入堵塞状态。
堵塞时不能进入排队对列,只有当引起堵塞的原因被消除后,线程才可以转入就绪状态。
5,死亡状态线程调用stop方法,或润、方法执行完,即处于死亡状态。
此线程不具有继续执行的能力。
停止线程stop已经过时。
如何停止线程呢?只有一种,run方法结束。
开启多线程运行,运行代码通常是循环结构。
只要控制主循环,就可以让run方法结束,也就是线程结束。
特殊情况:当线程处于了冻结状态。
就不会读取到标记。
那么线程就不会结束。
当没有指定的方式让冻结的线程恢复到运行状态时,这时就需要对冻结进行消除强制让线程恢复到运行状态中来。
这样就可以操作标记让线程结束。
Thread类提供该方法 interrupt();守护线程join:让一个线程强制运行,线程强制运行期间,其他线程无法运行,必须等待此线程完成之后才可以继续执行。
join可以用来临时加入线程执行。
class Demo implements Runnable{public void run(){for(int x=0;x<70;x++){System.out.println(Thread.currentThread().getName()+"..."+x);}}}class JoinDemo{public static void main(String[] args){Demo d=new Demo();Thread t1=new Thread(d);Thread t2=new Thread(d);t1.start();t1.join();t2.start();for(int x=0;x<80;x++){System.out.println("main..."+x);}System.out.println("over");}}线程休眠:sleep():允许线程进入暂时的休眠。
直接使用Thread.sleep()方法。
线程中断:、、interrupt()中断之后将执行catch中的代码。
后台线程:在java程序中,只要前台有一个线程在运行,则整个java进程都不会消失,此时应设置一个后台线程。
直接使用setDaemon()方法。
Thread t=new Thread(mt);//实例化Thread类对象t.setDaemon(true);//此线程在后台运行。
t.satrt();//启动该线程线程的优先级:在java的线程操作中,所有线程在运行前都会保持在就绪状态,那么此时,哪个线程优先级高,那个线程多线程就有可能先被执行。
设置优先级:setPriority();Thread t1=new Thread(new MyThread(),"线程A");//实例化线程对象Thread t2=new Thread(new MyThread(),"线程A");//实例化线程对象Thread t3=new Thread(new MyThread(),"线程A");//实例化线程对象t1.setPriority(Thread.MIN_PRIORITY); //设置线程优先级为最低t2.setPriority(Thread.MAX_PRIORITY); //设置线程优先级为最高t3.setPriority(Thread.NORM_PRIORITY); //设置线程优先级为中等t1.start(); //启动线程t2.start(); //启动线程t3.start(); //启动线程并非线程的优先级越高就一定会先执行,哪个线程先执行将由cpu的调度决定。
主线程优先级为中等级别。
线程的礼让yield方法将一个线程暂时让给其他线程执行,多线程的运行出现了安全问题:问题的原因:当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完, 另一个线程参与进来执行。
导致共享数据的错误。
解决办法:对多条操作共享数据的语句,只能让一个线程都执行完。
在执行过程中,其他线程不可以参与执行。
java对于多线程的安全问题提供了专业的解决方式。
就是同步代码块。
synchronized(对象){需要被同步的代码;(看哪些语句在操作共享数据)}}对象如同锁。
持有锁的线程可以在同步中执行。
没有持有锁的线程即使获取cpu的执行权,也进不去,因为没有获取锁。
同步的前提:1,必须要有两个或者两个以上的线程。
2,必须是多个线程使用同一个锁。
必须保证同步中只能有一个线程在运行。
好处:解决了多线程的安全问题弊端:多个线程需要判断锁,较为消耗资源。
class Ticket implements Runnable{private static int tick=100;//定义成静态,生命周期太长。
Object obj=new Object();public void run(){while(true){synchronized(obj){if(tick>0){try{Thread.sleep(10);}catch(Exception e){}//有异常,不能抛(接口不能抛)System.out.println(Thread.currentThread().getName()+"sale:"+tick--);}}}}}main{Ticket t=new Ticket();//不是线程Thread t1=new Thread(t);//创建线程,里面有构造方法,可以接收Thread t2=new Thread(t);//创建线程Thread t3=new Thread(t);//创建线程Thread t4=new Thread(t);//创建线程t1.start();//开启线程,调用的是Thread中的run方法t2.start();t3.start();t4.start();}2,同步方法将一个方法设置成同步函数。
class MyThread implements Runnable{ //实现Runnable接口private int ticket=5; //一共5张票public void run(){ //覆写run()方法for(int i=0;i<100;i++){ //超出票数循环this.sale(); //调用同步方法。
}}public synchronized void sale(){ //声明同步方法if(ticket<0){ //判断票是否有剩余try{Thread.sleep(300); //加入延迟}catch(InterruptedException e){e.printStackTrace();}System.out.println("卖票:ticket="+ticket--);}}}main{MyThread mt=new MyThread(); //定义线程对象Thread t1=new Thread(mt); //定义Thread对象Thread t1=new Thread(mt); //定义Thread对象t1.start();t2.start();}同步函数用的是哪一个锁呢?函数需要被对象调用。
那么函数都有一个所属对象引用。
就是this所以同步函数使用的锁就是this。
如果同步函数被静态修饰后,使用的锁是什么呢?通过验证,发现不在时this。
因为静态方法中也不可以定义this。
静态进内存是,内存中没有本类对象,但是一定有该类对应的字节码文件对象。
类名.class 该对象的类型是class静态的同步方法,使用的锁是该方法所在类的字节码文件对象。
类名.class多线程单例设计模式饿汉式class Single{private static final Single s=new Single();private Single(){}public static Single getInstance(){return s;}}懒汉式死锁同步中嵌套同步。
线程间通信:其实就是多个线程在操作同一个资源。
但是操作的动作不同。
wait();notify();唤醒notifyAll();都是用在同步中,因为要对持有监视器(锁)的线程操作。
所以要使用在同步中,因为只有同步才具有锁。
为什么这些操作线程的方法要定义object类中呢?因为这些方法在操作同步中线程时,都必须要标识它们所操作线程只有的锁。
只有同一个锁上的被等待线程,可以被同一个锁上notify唤醒。
不可以对不同锁中的线程进行唤醒。
也就是说,等待和唤醒必须是同一个锁。
而锁可以是任意对象,所以可以被任意对象调用的方法定义Object类中。
JDK1.5中提供了多线程升级解决方案。
将同步Synchronized替换成实Lock操作。
将object中的wait,notify,notifyAll,替换了Condition对象。
该对象可以Lock锁 进行获取。
该示例中,实现了本方只唤醒对方操作。
注意:多个线程共享同一资源时需要进行同步,以保证资源操作的完整性,但是过多的同步就有可能产生死锁。
练习:创建两个线程,和主线程交替运行。
class Test extends Thread{public void run(){for(int x=0;x<60;x++){System.out.println((Thread.currentThread()==this)+"..."this.getName()+"run...."+x);}}}main{Test t1=new Test();Test t2=new Test();t1.start();t2.start();for(int x=0;x<60;x++){System.out.println("main...."+x);}}多线程运行出现了安全问题。