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>
- Java多线程中sleep,wait区别
- java多线程中yield(),sleep(),wait()区别
- java多线程(7)--多线程中sleep和wait的区别
- java多线程中wait和sleep的区别
- Java多线程中Sleep与Wait的区别
- Java多线程中sleep()和wait()有什么区别
- Java多线程中sleep()和wait()有什么区别
- Java多线程中Sleep与Wait的区别
- 总结:Java多线程中wait和sleep的区别
- Java多线程中Sleep与Wait的区别
- Java多线程中Sleep与Wait的区别
- Java多线程中Sleep与Wait的区别
- Java多线程中Sleep与Wait的区别?
- Java多线程中Sleep与Wait的区别
- java多线程中wait()和sleep()方法的区别
- java中多线程(1)之sleep与wait的区别
- java中的多线程中wait和sleep方法的区别
- 多线程中sleep()和wait()的区别
- Week6-3,4Language Modelling1
- Graphic知识点摘记
- 第13周项目4 算法验证—拓扑排序算法
- VS 和 VAssistX 常用快捷键
- iOS开发之关闭ARC环境
- Java多线程中sleep,wait区别
- ifXXX if XXX else if 的执行顺序 [
- 第十六周实践项目 - 英文单词的基数排序
- 视频的横竖屏
- pickle,hashlib,shelve
- poj 3211 Washing Clothes 分组背包?
- 【Boots学习笔记】Bootstrap学习
- 利用Opencv自带源码,调试摄像头做人脸检测
- 数据结构期末总结(对翻转课堂的感受)