Java线程存储

标签 java multithreading

所以,我有一个循环,我在其中创建了数千个线程来处理我的数据。

我检查并存储线程会减慢我的应用程序。

它来 self 的循环:

Record r = new Record(id, data, outPath, debug);
//r.start();
threads.add(r);

//id is 4 digits
//data is something like 500 chars long

它会暂时停止我的 for 循环(一次运行需要一秒或更长时间,太多了!)。

只有 init > duration: 0:00:06.369

将线程添加到 ArrayList > duration: 0:00:07.348


问题:

  • 存储线程的最佳方式是什么?
  • 如何使线程更快?
  • 我是否应该创建线程并使用特殊执行程序运行它们,例如一次运行 10 个,然后再运行 10 个等等? (如果是,那么如何?)

最佳答案

请考虑拥有大量线程并不是很有用。

至少你可以同时执行的线程数等于你的cpu核心数。

最好的方法是重用现有的线程。为此,您可以使用执行器框架。

例如,要创建一个内部最多处理 10 个线程的执行器,您可以执行以下操作:

List<Record> records = ...;

ExecutorService executor = Executors.newFixedThreadPool(10);

for (Record r : records) {
   executor.submit(r);
}

// At the end stop the executor
executor.shutdown();

使用与此类似的代码,您还可以提交数千条命令(可运行的实现),但创建的线程不会超过 10 个。

关于Java线程存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34614540/

相关文章:

c - 增加 xcode 上的线程数会增加程序时间

java - ExecutorService 对单个线程的时间限制

java - GWT Place Class 增强可行性

java - 有没有办法控制 cucumber 特征的顺序?

java - 弗林克 SQL : Repeating grouping keys in result of GROUP BY query

java - 移动物体的漫射照明

java - @PersistenceContext 如何保证线程安全?

c++ - WSAAsync从另一个线程选择并发送

c++ - 为什么 'wait with predicate'解决了条件变量的 'lost wakeup'?

java - 如何通过反射初始化类并指定类的泛型类型