【发布时间】:2017-01-29 04:51:44
【问题描述】:
我有多个线程从同一个队列写入和读取。我正在使用 ConcurrentLinkedQueue。任何线程都可以将元素添加到队列中,并且任何其他线程都可以轮询一个元素并对其进行处理。我的问题是,如果队列为空,我希望在队列上轮询的线程等到某个元素被其他线程添加到它,如果所有线程都在等待而没有线程正在写入,则整个进程应该退出。 我正在使用它来列出目录及其子目录中的所有文件#faster scan。
以下是代码sn-p 1:
{
私有队列 dList = new ConcurrentLinkedQueue();
/* 一些处理代码 */
public void Run
{
/* some processing code */
while(dName == null)
{
try{
synchronized(dList){
dList.wait();
}
} catch(InterruptedException e){}
dName = dList.poll();
}
/* some processing code */
{
dList.add(item);
synchronized(dList){
dList.notifyAll();
}
}
}
上面的代码对吗?它是否一直在做我想做的事。虽然程序运行良好,但我不明白线程是如何退出的,因为我没有提到任何退出条件。
在 ConcurrentLinkedQueue 上使用同步是否正确? 这也适用于巨大的目录吗? 编辑1: 使用 LinkedBlockingQueue,但是当所有线程都处于等待状态时如何退出,这意味着没有更多的目录可以扫描? 它是否可以使用一个静态变量,增加它并检查它是否等于线程数,然后退出。它有效还是有更好的解决方案?
编辑 2: 谢谢你们。 退出线程由 AtomicInteger 解决。如果所有线程都在队列中等待,则它们的 AtomicInteger 递增,如果 AtomicInteger 等于线程数则中断;
【问题讨论】:
标签: java multithreading