标签:
1、毕老师第十四天内容,线程间的通信。大概是使用wait(),notify()等一系列函数来控制各个线程的CPU执行资格和执行权,通过合适的时机在各个线程当中切换来达到线程间通信的目的。
涉及到的方法:
wait():让线程处于等待状态,被wait()的线程会被存储到线程池当中,直到被唤醒。只能在同步方法中被调用。
notify():随机选择一个在该对象上调用wait方法的线程,解除其阻塞状态。只能在同步方法和同步代码块中被调用。
notifyAll():接触所有在该对象上调用wait()方法的线程的阻塞状态。只能在步方法和同步代码块中被调用。
之所以强调只能在同步中被调用,是因为在一个同步锁中被等待的线程,仅能从同一个同步锁中的另一个线程解除阻塞状态。同时需要注意的是,这些方法都是定义在Object类当中的,是因为这些方法都是监视器方法,那么监视器又是什么呢?在目前我看到的描述当中,线程的监视器,就是线程所持有的锁,也就是使用synchronized关键字关联的一个对象。由于锁是可以使用任意对象的,因此锁的方法必须是Object当中定义的。
1 class output implements Runnable 2 { 3 demo r; //需要进行输出的对象 4 output(demo r)//构造函数,从主函数中传入一个资源对象作为共同的处理内容 5 { 6 this.r = r; 7 } 8 public void run() 9 { 10 while(true) 11 { 12 synchronized(r)//同步锁,保证在输出的时候,输入线程不对资源进行修改 13 { 14 if(!r.flag) //如果是假,那么就进行等待 15 try{r.wait();}catch(InterruptedException e){}//等待,需要进行异常处理 16 System.out.println(r.name+"..."+r.sex); //如果flag为真,会进入这一步,对资源进行输出 17 r.flag = false; //将flag置为假,让输出线程进行等待 18 r.notify(); //在等待之前先唤醒另外一个线程,注意这里的唤醒应该是随机的,但仅有两个线程,所以没关系 19 } 20 } 21 } 22 }
这里使用了一个视频中的输出线程来作为wait()和notify()方法的实例。
2016年4月24日_JAVA学习笔记_多线程三_线程间通信
标签:
原文地址:http://www.cnblogs.com/pengjian-one/p/5427668.html