sleep()与wait()之间的不同
2015-12-02 19:27
555 查看
sleep()方法用来阻塞进程一定时间,这个时间可以自己来指定,wait()方法会使线程进入等待状态,并且它不能自动恢复,只有调用了notify()或者notifyAll()之后才能继续执行。
最主要的不同是wait()释放了锁或者控制器,但是sleep()在等待的过程中没有释放任何的锁或者控制器。一般情况下,wait()用于线程间的通信,sleep()用于暂停程序的执行。
Thread.sleep()使当前线程在一定时间内进入”不可运行”状态,并且线程会保持它所获取的控制器或者锁。例如:如果Thread.sleep()当前处于一个synchronized块中或者方法中,那么另一个线程是不能进入这个synchronized块或者方法。如果另外一个线程调用t.interrupt(),它将唤醒这个休眠线程。值得注意的是,sleep()是一个静态方法,这意味着它总会影响当前运行了sleep()方法的线程。一个常见的错误是在另一个线程中调用t.sleep(),这样使用也只会使当前进程进行休眠,而不是t这个线程。
object.wait()也是使当前线程进入”不可运行“状态,但是不同的是,Wait是被一个对象调用,不是一个线程;我们称这个对象为”锁对象“。lock.wait()必须放在synchronized块中,并且使用这个”锁对象“当做对象锁。wait()执行之后,就会释放这个锁,并且将当前线程加入到跟这个锁相关联的”等待列表“中。之后,另一个线程就可以异步的使用这个锁对象,并且调用lock.notify(),它会唤醒之前那个等待的线程。一般情况下,wait()/notify() 类似于sleep()/interrupt()。
下面从以下几个方面进行讨论。
调用:
wait():被一个对象调用,并且必须在synchronized块中,锁对象就是调用对象。
sleep():被一个线程调用,总是使当前执行线程休眠。
Synchronized:
wait(): 同步多线程一个接一个访问同一个对象。
sleep():同步多线程访问的时候,必须sleep()休眠完成之后,才能访问。
唤醒状态:
wait():直到调用对象的notify(), notifyAll()方法。
sleep():直到休眠时间结束或者调用interrupt()。
使用:
sleep(): 作为时间异步
wait():作为多线程异步
原文:Difference between sleep() and wait()?
最主要的不同是wait()释放了锁或者控制器,但是sleep()在等待的过程中没有释放任何的锁或者控制器。一般情况下,wait()用于线程间的通信,sleep()用于暂停程序的执行。
Thread.sleep()使当前线程在一定时间内进入”不可运行”状态,并且线程会保持它所获取的控制器或者锁。例如:如果Thread.sleep()当前处于一个synchronized块中或者方法中,那么另一个线程是不能进入这个synchronized块或者方法。如果另外一个线程调用t.interrupt(),它将唤醒这个休眠线程。值得注意的是,sleep()是一个静态方法,这意味着它总会影响当前运行了sleep()方法的线程。一个常见的错误是在另一个线程中调用t.sleep(),这样使用也只会使当前进程进行休眠,而不是t这个线程。
object.wait()也是使当前线程进入”不可运行“状态,但是不同的是,Wait是被一个对象调用,不是一个线程;我们称这个对象为”锁对象“。lock.wait()必须放在synchronized块中,并且使用这个”锁对象“当做对象锁。wait()执行之后,就会释放这个锁,并且将当前线程加入到跟这个锁相关联的”等待列表“中。之后,另一个线程就可以异步的使用这个锁对象,并且调用lock.notify(),它会唤醒之前那个等待的线程。一般情况下,wait()/notify() 类似于sleep()/interrupt()。
synchronized(LOCK) { Thread.sleep(1000); // LOCK is held } synchronized(LOCK) { LOCK.wait(); // LOCK is not held }
下面从以下几个方面进行讨论。
调用:
wait():被一个对象调用,并且必须在synchronized块中,锁对象就是调用对象。
sleep():被一个线程调用,总是使当前执行线程休眠。
Synchronized:
wait(): 同步多线程一个接一个访问同一个对象。
sleep():同步多线程访问的时候,必须sleep()休眠完成之后,才能访问。
唤醒状态:
wait():直到调用对象的notify(), notifyAll()方法。
sleep():直到休眠时间结束或者调用interrupt()。
使用:
sleep(): 作为时间异步
wait():作为多线程异步
原文:Difference between sleep() and wait()?
相关文章推荐
- containing working copy admin area is missing
- bing背单词交互流程 - Chongyang Bai
- dispatch_release & dispatch_retain
- linker command failed with exit code 1 (use -v to see invocation)总结
- 异常信息ASM ClassReader failed to parse class file的问题解决
- 邮箱开发(三) - MailCore2 详细使用
- 如何多个应用共享keychain.
- 【Leetcode】Contains Duplicate
- U盘多个分区合并起来的教程 http://jingyan.baidu.com/article/9989c7461be945f648ecfe3e.html
- 大牛们的blog (人工智能与机器学习)
- stl之pair,map,vector区别
- kafka.common.FailedToSendMessageException: Failed to send messages after 3 tries.
- [Alfred]为Baidu Weather Workflow更新图标
- mysql通过sqoop导入到hbase中时数据量为1000w时出现Incorrect key file for table '/tmp/#sql_458_0.MYI'; try to repair it
- RAID , LVM , 配置静态IP 浅析
- poj1273--Drainage Ditches(最大流Edmond-Karp算法 邻接表实现)
- show table detail
- ECS服务器ssh登录提示“Permission denied, please try again”
- linker command failed with exit code 1 (use -v to see
- main(int argc, char*argv[])函数里参数的含义