黑马程序员-wait和sleep的作用和区别
来源:互联网 发布:ecshop淘宝客采集插件 编辑:程序博客网 时间:2024/05/18 13:10
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
package com.itcast.test2;/** * wait方法和sleep方法有什么作用,区别是什么? * sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程, * 但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 * wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁, * 进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后 * 本线程才进入对象锁定池准备获得对象锁进入运行状态。) * @author shandawang * */public class MultiThread { public static void main(String[] args) { // TODO Auto-generated method stub new Thread(new Thread1()).start(); try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } new Thread(new Thread2()).start(); } private static class Thread1 implements Runnable { @Override public void run() { // TODO Auto-generated method stub //由于这里的Thread1和下面的Thread2内部run方法要用同一对象作为监视器,我们这里不能用this, //因为在Thread2里面的this和这个Thread1的this不是同一个对象。我们用MultiThread.class这个 //字节码对象,当前虚拟机里引用这个变量时,指向的都是同一个对象。 synchronized (MultiThread.class) { System.out.println("enter thread1..."); System.out.println("thread1 is waiting"); try { //释放锁有两种方式,第一种方式是程序自然离开监视器的范围,也就是离开了synchronized关键字管辖的 //代码范围,另一种方式就是在synchronized关键字管辖的代码内部调用监视器对象的wait方法。这里,使用wait方法释放锁。 MultiThread.class.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("thread1 is going on..."); System.out.println("thread1 is being over!"); } } } private static class Thread2 implements Runnable { @Override public void run() { // TODO Auto-generated method stub synchronized (MultiThread.class) { System.out.println("enter thread2..."); System.out.println("thread2 notify other thread can release wait status.."); //由于notify方法并不释放锁, 即使thread2调用下面的sleep方法休息了500毫秒,但thread1仍然 //不会执行,因为thread2没有释放锁,所以Thread1无法得不到锁。 MultiThread.class.notify(); // System.out.println("thread2 is sleeping ten millisecond..."); System.out.println("thread2 is waiting, other thread can run now..."); try { //Thread.sleep(10); MultiThread.class.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("thread2 is going on..."); System.out.println("thread2 is being over!"); } } } }
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
- 黑马程序员-wait和sleep的作用和区别
- 黑马程序员:线程wait()和sleep()的区别
- sleep() 和 wait() 的区别
- wait()和sleep()的区别
- sleep和wait的区别
- sleep() 和 wait() 的区别
- sleep和wait的区别
- sleep和wait的区别
- wait和sleep的区别
- sleep和wait的区别
- wait()和sleep()的区别
- sleep()和wait()的区别
- wait()和sleep()的区别
- Sleep()和wait()的区别?
- sleep()和wait()的区别
- sleep和wait的区别
- wait() 和 sleep() 的区别
- sleep和wait的区别
- cglib jar包中Enhancer的简单使用
- Myeclipse ALT+/ 不提示代码
- 发布本地jar到Nexus仓库
- Hiptype:分析电子书阅读习惯和读者群体
- Android中dip、dp、sp、pt和px的区别
- 黑马程序员-wait和sleep的作用和区别
- 分享福州网(fuzhou99.com)论坛的绝对定位浮动导航条+返回顶部 JS效果
- 【KMP】 hdu1867 A + B for you again
- 【SOJ-1865整数划分】优化
- Android基础之组件生命周期
- HDU 4322 最大费用最大流 2012 Multi-University Training Contest 3
- 线程与进程的区别
- PHP手册-call_user_func
- hdu 1134 Game of Connections(卡特兰数)