Java阻塞队列(BlockingQueue)的代码

将代码过程经常用到的一些代码段收藏起来,如下的代码内容是关于Java阻塞队列(BlockingQueue)的代码。

public interface Delayed extends Comparable {
long getDelay(TimeUnit unit);
}

放入DelayQueue的元素还将要实现compareTo方法,DelayQueue使用这个来为元素排序。下面的实例展示了如何使用阻塞队列来控制线程集。程序在一个目录及它的所有子目录下搜索所有文件,打印出包含指定关键字的文件列表。从下面实例可以看出,使用阻塞队列两个显著的好处就是:多线程操作共同的队列时不需要额外的同步,另外就是队列会自动平衡负载,即那边(生产与消费两边)处理快了就会被阻塞掉,从而减少两边的处理速度差距。下面是具体实现:Java代码

public class BlockingQueueTest {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("Enter base directory (e.g. /usr/local/jdk5.0/src): ");
String directory = in.nextLine();
System.out.print("Enter keyword (e.g. volatile): ");
String keyword = in.nextLine();

    BlockingQueue<File> queue = new ArrayBlockingQueue<File>(  
            FILE_QUEUE_SIZE);  

    FileEnumerationTask enumerator = new FileEnumerationTask(queue,  
            new File(directory));  
    new Thread(enumerator).start();  
      
    for (int i = 1; i <= SEARCH_THREADS; i++)  
        new Thread(new SearchTask(queue, keyword)).start();  
}  

}
class FileEnumerationTask implements Runnable {
public static File DUMMY = new File("");

private BlockingQueue<File> queue;  
private File startingDirectory;  

public FileEnumerationTask(BlockingQueue<File> queue, File startingDirectory) {  
    this.queue = queue;  
    this.startingDirectory = startingDirectory;  
}  

public void run() {  
    try {  
        enumerate(startingDirectory);  
    } catch (InterruptedException e) {  
    }  
}  

public void enumerate(File directory) throws InterruptedException {  
    File[] files = directory.listFiles();  
    for (File file : files) {  
        if (file.isDirectory())  
            enumerate(file);  
        else  
            queue.put(file);  
    }  
}  

}
class SearchTask implements Runnable {
private BlockingQueue queue;
private String keyword;

public SearchTask(BlockingQueue<File> queue, String keyword) {  
    this.queue = queue;  
    this.keyword = keyword;  
}  

public void run() {  
    try {  
        boolean done = false;  
        while (!done) {  
            File file = queue.take();  
            if (file == FileEnumerationTask.DUMMY) {  
                queue.put(file);  
                done = true;  
            } else  
                search(file);  
        }  
    } catch (IOException e) {  
        e.printStackTrace();  
    } catch (InterruptedException e) {  
    }  
}  
public void search(File file) throws IOException {  
    Scanner in = new Scanner(new FileInputStream(file));  
    int lineNumber = 0;  
    while (in.hasNextLine()) {  
        lineNumber++;  
        String line = in.nextLine();  
        if (line.contains(keyword))  
            System.out.printf("%s:%d:%s%n", file.getPath(), lineNumber,  
                    line);  
    }  
    in.close();  
}  

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值