码迷,mamicode.com
首页 > 编程语言 > 详细

2016年4月24日_JAVA学习笔记_多线程三_线程间通信

时间:2016-04-24 18:47:10      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!