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

关于 java.util.concurrent 您不知道的 5 件事,第 1 部分:通过并发 Collections 进行多线程编程

 2010-07-02 00:00:00 来源:WEB开发网   
核心提示: 5. SynchronousQueues根据 Javadoc,SynchronousQueue 是个有趣的东西:这是一个阻塞队列,关于 java.util.concurrent 您不知道的 5 件事,第 1 部分:通过并发 Collections 进行多线程编程(4),其中,每个插入操作必须等待

5. SynchronousQueues

根据 Javadoc,SynchronousQueue 是个有趣的东西:

这是一个阻塞队列,其中,每个插入操作必须等待另一个线程的对应移除操作,反之亦然。一个同步队列不具有任何内部容量,甚至不具有 1 的容量。

本质上讲,SynchronousQueue 是之前提过的 BlockingQueue 的又一实现。它给我们提供了在线程之间交换单一元素的极轻量级方法,使用 ArrayBlockingQueue 使用的阻塞语义。在清单 2 中,我重写了 清单 1 的代码,使用 SynchronousQueue 替代 ArrayBlockingQueue:

清单 2. SynchronousQueue

import java.util.*; 
import java.util.concurrent.*; 
 
class Producer 
  implements Runnable 
{ 
  private BlockingQueue<String> drop; 
  List<String> messages = Arrays.asList( 
    "Mares eat oats", 
    "Does eat oats", 
    "Little lambs eat ivy", 
    "Wouldn't you eat ivy too?"); 
     
  public Producer(BlockingQueue<String> d) { this.drop = d; } 
   
  public void run() 
  { 
    try 
    { 
      for (String s : messages) 
        drop.put(s); 
      drop.put("DONE"); 
    } 
    catch (InterruptedException intEx) 
    { 
      System.out.println("Interrupted! " + 
        "Last one out, turn out the lights!"); 
    } 
  }   
} 
 
class Consumer 
  implements Runnable 
{ 
  private BlockingQueue<String> drop; 
  public Consumer(BlockingQueue<String> d) { this.drop = d; } 
   
  public void run() 
  { 
    try 
    { 
      String msg = null; 
      while (!((msg = drop.take()).equals("DONE"))) 
        System.out.println(msg); 
    } 
    catch (InterruptedException intEx) 
    { 
      System.out.println("Interrupted! " + 
        "Last one out, turn out the lights!"); 
    } 
  } 
} 
 
public class SynQApp 
{ 
  public static void main(String[] args) 
  { 
    BlockingQueue<String> drop = new SynchronousQueue<String>(); 
    (new Thread(new Producer(drop))).start(); 
    (new Thread(new Consumer(drop))).start(); 
  } 
}

实现代码看起来几乎相同,但是应用程序有额外获益:SynchronousQueue 允许在队列进行一个插入,只要有一个线程等着使用它。

在实践中,SynchronousQueue 类似于 Ada 和 CSP 等语言中可用的 “会合通道”。这些通道有时在其他环境中也称为 “连接”,这样的环境包括 .NET 。

结束语

当 Java 运行时知识库提供便利、预置的并发性时,为什么还要苦苦挣扎,试图将并发性导入到您的 Collections 类?本系列的下一篇文章将会进一步探讨 java.util.concurrent 名称空间的内容。

本文示例源代码或素材下载

上一页  1 2 3 4 

Tags:关于 java util

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