技术开发 频道

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

  尽管 Guarded Blocks 教程中的代码有效,但是它耗时久,混乱,而且也并非完全直观。退回到 Java 平台较早的时候,没错,Java 开发人员不得不纠缠于这种代码;但现在是 2010 年 — 情况难道没有改善?

  清单 1 显示了 Guarded Blocks 代码的重写版,其中我使用了一个 ArrayBlockingQueue,而不是手写的 Drop。

  清单 1. BlockingQueue

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 ABQApp
{
    
public static void main(String[] args)
    {
        BlockingQueue
<String> drop = new ArrayBlockingQueue(1, true);
        (
new Thread(new Producer(drop))).start();
        (
new Thread(new Consumer(drop))).start();
    }
}
0
相关文章