java - 如何在 Java 中设置线程限制

标签 java multithreading limit

假设我有 1000 个文件要读取,由于某些限制,我想并行读取最多 5 个文件。而且,一旦其中一个完成,我想要一个新的开始。

我有一个包含文件列表的主函数,每当一个线程完成时,我都会尝试更改计数器。但它不起作用!

有什么建议吗?

下面是主函数循环

for (final File filename : folder.listFiles()) {

    Object lock1 = new Object();
    new myThread(filename, lock1).start();
    counter++;
    while (counter > 5);
}

最佳答案

像这样产生线程不是要走的路。使用 ExecutorService 并将池指定为 5。将所有文件放入 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);
        }
    }
}

关于java - 如何在 Java 中设置线程限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8651427/

相关文章:

python - Scrapy LinkExtractor - 限制每个 URL 抓取的页面数量

mysql - 在 MySQL 中通过复杂表达式获取 N 行顺序的有效方法

python - python xgoogle 库的问题。如何增加 10 个结果的限制?

java - JDBC:使用 PreparedStatement 创建表,SQL 语法错误与否?

c++ - 确保当前线程持有 C++11 互斥锁

java - Jsoup.parse() 与 Jsoup.parse() - 或者 URL 检测在 Jsoup 中是如何工作的?

java - 没有打印语句,循环看不到其他线程更改的值

multithreading - 如何设置具有线程和不同精度的 FFTW?

java - Scope 如何影响 Bean 的对象?

java - 我应该永远不再使用原始类型吗?