在学习多线程的时候,你无法逃避sleep、wait、notify、notifyAll的关键字,我们肯定是对sleep用的最多,即使你写个Demo也要经常用到Thread.sleep(xxx)模拟等待的效果,没错吧。等等,这里一道面试题来了,sleep和wait都可以表示等待,那么这两个方法有什么区别呢? 有的人不知道啥区别,他们第一反应就是搜一下,我以前就是这样的。其实吧,一个较好的方法就是看官方是怎么解释的,还有什么比这个还要权威吗? 要么就是自行Google,看看英文文档也不错,还可以提高英一下文水平,是吧。关于程序员怎么提高英文水平,我以后会专门写篇文章来讲一讲,PS:本人大学英文过了六级,毕业后我每周都花点时间学习一下,对,是每周,一直至今,所以英文水平还是不错的,目前看英文IT文档基本无障碍。
废话不多说,直接上代码
import java.util.Scanner; public class Worker5 { public void action1() throws InterruptedException { synchronized (this) { System.out.println("有人在试衣间吗?哥要试试这性感的背心 "); wait(); System.out.println("好的,我进来了"); } } public void action2() throws InterruptedException { Scanner scanner = new Scanner(System.in); Thread.sleep(2000); synchronized (this) { System.out.println("姐在,你要等会儿,我正在穿衣服,不许偷看啊"); scanner.nextLine(); System.out.println("姐要马上出来了"); notify(); Thread.sleep(2000); } } }
这是我写的一个小例子,是用试衣间试衣服的例子解释wait与notify的区别。action1表示一个男生的行为,action2表示一个女生的行为。而这两个行为分别被两个线程持有,取名为t1,t2,运行完就是截图的效果。 首先男生问:【有人在试衣间吗?哥要试试这性感的背心】这个肯定是要t2线程来进行回应的,但是t1t2线程已经跑起来了,怎么能让t2回应呢?就是在t1使用wait() 方法 告诉t2来回应,就是t1处于等待状态,t2来执行。当女生:【姐在,你要等会儿,我正在穿衣服,不许偷看啊】,此刻相当于t2线程在跑程序,什么时候跑完呢?为了模拟执行对话,我按个空格键,女生才会说:【姐要马上出来了】。女生换完衣服后,说一句就好了,男生只要不是聋子都能听得到,这容易啊。但是现在跑的是线程是啊,t1线程怎么知道t2跑完了,t1还在等着呢。这里t2就要用notify()方法唤醒t1线程,所以男生说:【好的,我进来了】。这里有个问题来了,你仔细想想,万一有很多个男生在外面等着进去试衣服,女生衣服换好了,就大声说一句:我换好了,你们可以进来吧(万一发生什么事,我保证不了,那画面根本不能想象啊)同理,万一是很多线程等待t2怎么办呢,他们怎么知道t2跑完了呢,这个时候不就是用notifiyAll() 来唤醒那些等待的线程吗,是吧。 好了,这么一说,对于wait notify nitifyAll还是不难的吧,如果还是不太懂,多去试衣间试试衣服然后再想想,是不是这么回事。
-------------------------------------------------------------------------------------------------------------------------------------
下一篇准备讲讲 reentrantlock 与 condition的这一对难兄难弟,学习多线程知识的确很费脑,我得喝瓶酸奶补一补,下午茶,走着!