WEB开发网
开发学院软件开发Java 关于 java.util.concurrent 您不知道的 5 件事,第... 阅读

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

 2010-07-12 00:00:00 来源:WEB开发网   
核心提示:并发 Collections 提供了线程安全、经过良好调优的数据结构,简化了并发编程,关于 java.util.concurrent 您不知道的 5 件事,第 2 部分,然而,在一些情形下,尽管完全可以手动编写限制代码,但使用 Semaphore 类可以更轻松地完成此任务,开发人员需要更进一步,思考如何调节和/或限制线

并发 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(); 
  } 
} 

1 2 3 4  下一页

Tags:关于 java util

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接