课程咨询 :18487146383

长沙Java培训 > 达内新闻 > 达内长沙java培训详解:Guarded Blocks
  • 达内长沙java培训详解:Guarded Blocks

    发布:长沙Java培训      来源:码农网      时间:2016-09-21

  • 多线程之间经常需要协同工作,最常见的方式是使用Guarded Blocks,它循环检查一个条件(通常初始值为true),直到条件发生变化才跳出循环继续执行。在使用Guarded Blocks时有以下几个步骤需要注意:

    假设guardedJoy方法必须要等待另一线程为共享变量joy设值才能继续执行。那么理论上可以用一个简单的条件循环来实现,但在等待过程中guardedJoy方法不停的检查循环条件实际上是一种资源浪费。

    public void guardedJoy() {

    // Simple loop guard. Wastes

    // processor time. Don't do this!

    while(!joy) {}

    System.out.println("Joy has been achieved!");

    }

    更加高效的保护方法是调用Object.wait将当前线程挂起,直到有另一线程发起事件通知(尽管通知的事件不一定是当前线程等待的事件)。

    public synchronized void guardedJoy() {

    // This guard only loops once for each special event, which may not

    // be the event we're waiting for.

    while(!joy) {

    try {

    wait();

    } catch (InterruptedException e) {}

    }

    System.out.println("Joy and efficiency have been achieved!");

    }

    注意:一定要在循环里面调用wait方法,不要想当然的认为线程唤醒后循环条件一定发生了改变。

    和其他可以暂停线程执行的方法一样,wait方法会抛出InterruptedException,在达内长沙java培训上面的例子中,因为我们关心的是joy的值,所以忽略了InterruptedException。

    为什么guardedJoy是synchronized的?假设d是用来调用wait的对象,当一个线程调用d.wait,它必须要拥有d的内部锁(否则会抛出异常),获得d的内部锁的最简单方法是在一个synchronized方法里面调用wait。

    当一个线程调用wait方法时,它释放锁并挂起。然后另一个线程请求并获得这个锁并调用Object.notifyAll通知所有等待该锁的线程。

    public synchronized notifyJoy() {

    joy = true;

    notifyAll();

    }

    当第二个线程释放这个该锁后,第一个线程再次请求该锁,从wait方法返回并继续执行。

    达内长沙java培训提醒大家注意:还有另外一个通知方法,notify(),它只会唤醒一个线程。但由于它并不允许指定哪一个线程被唤醒,所以一般只在大规模并发应用(即系统有大量相似任务的线程)中使用。因为对于大规模并发应用,我们其实并不关心哪一个线程被唤醒。

    现在我们使用Guarded blocks创建一个生产者/消费者应用。这类应用需要在两个线程之间共享数据:生产者生产数据,消费者使用数据。两个线程通过共享对象通信。在这里,线程协同工作的关键是:生产者发布数据之前,消费者不能够去读取数据;消费者没有读取旧数据前,生产者不能发布新数据。

上一篇:达内长沙java培训详解:Fork/Join

下一篇:达内长沙java培训详解:活跃度(Liveness)

最新开班日期  |  更多

Java--大数据业余制班

Java--大数据业余制班

开班日期:4月28日

Java--大数据全日制班

Java--大数据全日制班

开班日期:4月28日

Java--零基础业余班

Java--零基础业余班

开班日期:4月28日

Java--零基础全日制班

Java--零基础全日制班

开班日期:4月28日

  • 网址:http://cs.java.tedu.cn     地址:长沙市开福区芙蓉中路一段 476 号建鸿达现代城 9 楼
  • 课程培训电话:18487146383     全国服务监督电话:400-111-8989
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56