Java sleep wait 在多线程中的区别
来源:互联网 发布:android性能优化工具 编辑:程序博客网 时间:2024/06/11 14:31
sleep用于线程控制,而wait用于线程间的通信,与wait配套的方法还有notify和notifyAll.
区别一:
sleep是Thread类的方法,是线程用来 控制自身流程的,比如有一个要报时的线程,每一秒中打印出一个时间,那么我就需要在print方法前面加上一个sleep让自己每隔一秒执行一次。就像个闹钟一样。
wait是Object类的方法,用来线程间的通信,这个方法会使当前拥有该对象锁的进程等待直到其他线程调用notify方法时再醒来,不过你也可以给他指定一个时间,自动醒来。这个方法主要是用走不同线程之间的调度的。
区别二 :
关于锁的释放 ,在这里假设大家已经知道了锁的概念及其意义。调用sleep方法不会释放锁(自己的感觉是sleep方法本来就是和锁没有关系的,因为他是一个线程用于管理自己的方法,不涉及线程通信)
区别三:
使用区域
由于wait函数的特殊意义,所以他是应该放在同步语句块中的,这样才有意义 。因为wait 必须在 synchronized内部调用。
注意:两个方法都需要抛出异常
package com.test.sleepwait;public class MultiThread { public static void main(String[] args){ new Thread(new Thread1()).start(); try { Thread.sleep(5000); } catch (Exception e) { e.printStackTrace(); } new Thread(new Thread2()).start(); }}class Thread1 implements Runnable{ @Override public void run(){ synchronized(MultiThread.class){ System.out.println("Enter thread1..."); System.out.println("Thread1 is waiting..."); try{ MultiThread.class.wait(); } catch (Exception e) { e.printStackTrace(); } System.out.println("thread1 is going on ...."); System.out.println("thread1 is over!!!"); } }} class Thread2 implements Runnable{ @Override public void run(){ synchronized(MultiThread.class){ System.out.println("Enter thread2..."); System.out.println("Threa2 is waiting..."); MultiThread.class.notifyAll(); try{ Thread.sleep(5000); } catch (Exception e) { e.printStackTrace(); } System.out.println("thread2 is going on ...."); System.out.println("thread2 is over!!!"); } }}
打印
Enter thread1...
Thread1 is waiting...
Enter thread2...
Threa2 is waiting...
thread2 is going on ....
thread2 is over!!!
thread1 is going on ....
thread1 is over!!!
同时要注意一点:
当一个线程进入一个对象的一个 synchronized 方法后,其它线程是否可进入此对象的其它方法?
分几种情况:
1. 其他方法前是否加了 synchronized 关键字,如果没加,则能。
2. 如果这个方法内部调用了 wait,则可以进入其他synchronized方法。
3. 如果其他个方法都加了 synchronized 关键字,并且内部没有调用 wait,则不能。
(因为 sleep方法没有释放锁,而wait释放了锁。原来Thread2遇到synchronized 语句时,由运行状态转为阻塞。 档Thread1中调用了wait,同时释放了锁,所以Thread2中的 synchronized块又重新获得锁,所以能进去了。
)
- Java sleep wait 在多线程中的区别
- Java多线程:notify/notifyAll/wait/sleep在多线程中的区别于使用
- java多线程中的sleep()方法与wait()方法的区别
- java中的多线程中wait和sleep方法的区别
- java多线程 sleep()和wait()的区别
- java多线程 sleep()和wait()的区别
- java多线程 sleep()和wait()的区别
- java多线程 sleep()和wait()的区别
- java多线程 sleep()和wait()的区别
- java多线程 sleep()和wait()的区别
- java多线程 sleep()和wait()的区别
- java多线程 sleep()和wait()的区别
- java多线程 sleep()和wait()的区别
- java多线程 sleep()和wait()的区别
- java多线程 sleep()和wait()的区别
- java多线程 sleep()和wait()的区别
- java多线程 sleep()和wait()的区别
- java多线程 sleep()和wait()的区别
- iOS 开发之动力效果
- 30到运维面试题
- SBS-3数据输出详解
- Bootstrap中的JavaScript
- LeetCode Pascal's Triangle
- Java sleep wait 在多线程中的区别
- ECharts+BaiduMap+HT for Web网络拓扑图应用
- CSS基础:基本选择器分类和使用
- linux和windows内存布局验证
- poj(2299)——Ultra-QuickSort(归并排序求逆序数)
- 使用Android Studio导入源码
- 十一第四题Single Number III
- Xcode7适配iOS9遇到的一些问题及解决办法
- Linux free命令