Java多线程中sleep,wait区别

来源:互联网 发布:vscode 远程调试 编辑:程序博客网 时间:2024/05/16 01:11

sleep,wait区别

这两个方法主要来源是,sleep用于线程控制,而wait用于线程间的通信,与wait配套的方法还有notify和notifyAll.


   区别一

sleep是Thread类的方法,是线程用来 控制自身流程的,比如有一个要报时的线程,每一秒中打印出一个时间,那么我就需要在print方法前面加上一个sleep让自己每隔一秒执行一次。就像个闹钟一样。

wait是Object类的方法,用来线程间的通信,这个方法会使当前拥有该对象锁的进程等待知道其他线程调用notify方法时再醒来,不过你也可以给他指定一个时间,自动醒来。这个方法主要是用走不同线程之间的调度的。

  

   区别二 

关于锁的释放 ,在这里假设大家已经知道了锁的概念及其意义。调用sleep方法不会释放锁(自己的感觉是sleep方法本来就是和锁没有关系的,因为他是一个线程用于管理自己的方法,不涉及线程通信)

调用wait方法会释放当前线程的锁(其实线程间的通信是靠对象来管理的,所有操作一个对象的线程是这个对象通过自己的wait方法来管理的,就好像这个对象是电视机,三个人是三个线程,那么电视机的遥控器就是这个锁,假如现在A拿着遥控器,电视机调用wait方法,那么A就交出自己的遥控器,由jVM虚拟机调度,遥控器该交给谁。)【举个例子:如果A拿遥控器的期间,他可以用自己的sleep每隔十分钟调一次电视台,而在他调台休息的十分钟期间,遥控器还在他的手上~】

 区别三

使用区域  

由于wait函数的特殊意义,所以他是应该放在同步语句块中的,这样才有意义    。

yield()

方法Thread.yield()方法作用是:暂停当前正在执行的线程对象,并执行其他线程。

yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。

结论:yield()从未导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。


join()

Thread类中有一个join()方法,在一个线程中启动另外一个线程的join方法,当前线程将会挂起,而执行被启动的线程,知道被启动的线程执行完毕后,当前线程才开始执行。

下面我们新建两个继承Thread的类,让其中一个线程在另外一个线程中调用join

class Thread1 extends Thread{public Thread1(String threadName){super(threadName);}public void run(){System.out.println(getName() + "is running");try{sleep(2000);} catch (InterruptedException e){e.printStackTrace();}}}

class Thread2 extends Thread{private Thread1 thread1;public Thread2(String threadName, Thread1 thread1){super(threadName);this.thread1 = thread1;}public void run(){System.out.println(getName() +  "is running");try{thread1.start();thread1.join();} catch (InterruptedException e){e.printStackTrace();}System.out.println("thread2 is over");}}

public class JoinTest{public static void main(String[] args){Thread1 thread1 = new Thread1("Thread1");Thread2 thread2 = new Thread2("Thread2", thread1);thread2.start();}}</pre><br><br><pre></pre>我们在thead2中调用thread1的join()方法,让thread1中断thread2自身的运行,运行程序首先输出thread2 is running,然后输出thread1 is running, 过了两秒钟之后,才输出thread2 is over,这就说明在thread2中调用thread1的join()方法,thread2自身被中断了,转而执行thread1,等待thread1执行完毕之后,再转过来执行thread2<br>




1 0
原创粉丝点击