快速业务通道

关于java.util.concurrent您不知道的5件事,第2部分 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-13

关于java.util.concurrent您不知道的5件事,第2部分

时间:2012-04-24 IBM Ted Neward

并发 Collections 提供了线程安全、经过良好调优的数据结构,简化了并发编程。然而, 在一些情形下,开发人员需要更进一步,思考如何调节和/或限制线程执行。由于 java.util.concurrent 的总体目标是简化多线程编程,您可能希望该包包含同步实用程序,而 它确实包含。

本文是 第 1 部分 的延续,将介绍几个比核心语言原语(监视器)更高级的同步结构,但 它们还未包含在 Collection 类中。一旦您了解了这些锁和门的用途,使用它们将非常直观。

1. Semaphore

在一些企业系统中,开发人员经常需要限制未处理的特定资源请求(线程/操作)数量,事 实上,限制有时候能够提高系统的吞吐量,因为它们减少了对特定资源的争用。尽管完全可以 手动编写限制代码,但使用 Semaphore 类可以更轻松地完成此任务,它将帮您执行限制,如清 单 1 所示:

清单 1. 使用 Semaphore 执行限制

import java.util.*;import java.util.concurrent.*; public class SemApp {    public static void main(String[] args)    {      Runnable limitedCall = new Runnable() {        final Random rand = new Random();        final Semaphore available = new Semaphore(3);        int count = 0;        public void run()        {          int time = rand.nextInt(15);          int num = count++;          try          {            available.acquire();            System.out.println("Executing " +              "long-running action for " +              time + " seconds... #" + num);            Thread.sleep(time * 1000);            System.out.println("Done with #" +              num + "!");            available.release();          }          catch (InterruptedException intEx)          {            intEx.printStackTrace();          }        }      };      for (int i=0; i<10; i++)        new Thread(limitedCall).start();    } }

即使本例中的 10 个线程都在运行(您可以对运行 SemApp 的 Java 进程执行 jstack 来验 证),但只有 3 个线程是活跃的。在一个信号计数器释放之前,其他 7 个线程都处于空闲状 态。(实际上,Semaphore 类支持一次获取和释放多个 permit,但这不适用于本场景。)

关于java.util.concurrent您不知道的5件事,第2部分(2)

时间:2012-04-24 IBM Ted Neward

2. CountDownLatch

如果 Semaphore 是允许一次进入一个(这可能会勾起一些流行夜总会的保安的记忆)线程 的并发性类,那么 CountDownLatch 就像是赛马场的起跑门栅。此类持有所有空闲线程,直到 满足特定条件,这时它将会一次释放所有这些线程。

清单 2. CountDownLatch:让我们去赛马吧!

import java.util.*; import java.util.concurrent.*; class Race {    private Random rand = new Random();    private int distance = rand.nextInt(250);    private CountDownLatch start;    private CountDownLatch finish;    private List<String> horses = new ArrayList<String> ();   

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号