技术开发 频道

有关java.util.concurrent不知的事(一)

  清单 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 名称空间的内容。

0
相关文章