如何在Java中进行线程限制
问题内容:
假设我要读取1000个文件,并且由于某些限制,我想最多并行读取5个文件。而且,一旦其中一个完成,我希望一个新的开始。
我有一个具有文件列表的主要功能,每当一个线程完成时,我尝试更改一个计数器。但它不起作用!
有什么建议吗?
以下是主要功能循环
for (final File filename : folder.listFiles()) {
Object lock1 = new Object();
new myThread(filename, lock1).start();
counter++;
while (counter > 5);
}
问题答案:
像这样产生线程并不是要走的路。使用an ExecutorService
并将池指定为5。将所有文件放在a
BlockingQueue
或另一个线程安全的集合中,所有正在执行的文件都可以随意使用poll()
。
public class ThreadReader {
public static void main(String[] args) {
File f = null;//folder
final BlockingQueue<File> queue = new ArrayBlockingQueue<File>(1000);
for(File kid : f.listFiles()){
queue.add(kid);
}
ExecutorService pool = Executors.newFixedThreadPool(5);
for(int i = 1; i <= 5; i++){
Runnable r = new Runnable(){
public void run() {
File workFile = null;
while((workFile = queue.poll()) != null){
//work on the file.
}
}
};
pool.execute(r);
}
}
}