Java线程存储

Java线程存储,java,multithreading,Java,Multithreading,因此,我有一个循环,我创建了数千个线程来处理我的数据 我检查并存储线程会减慢我的应用程序的速度 它来自我的循环: 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循环一段时间(一次运行需要一秒钟或更长时间,太多了!) 仅初始>持续时间:0:00:06.36

因此,我有一个循环,我创建了数千个线程来处理我的数据

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

它来自我的循环:

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循环一段时间(一次运行需要一秒钟或更长时间,太多了!)

仅初始>持续时间:0:00:06.369

通过向ArrayList添加线程>持续时间:0:00:07.348


问题:

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

考虑一下,拥有大量线程不是很有用

至少您可以同时执行与cpu内核数量相等的线程数

最好是重用现有线程。为此,可以使用Executor框架

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

List<Record> records = ...;

ExecutorService executor = Executors.newFixedThreadPool(10);

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

// At the end stop the executor
executor.shutdown();
列出记录=。。。;
ExecutorService executor=Executors.newFixedThreadPool(10);
用于(记录r:记录){
执行人提交(r);
}
//最后停止执行人
executor.shutdown();

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

我猜,真正让您慢下来的不是.add方法。我的猜测是,数百个线程并行运行才是真正的问题所在。当然,像“add”这样的简单命令将在管道中排队,执行可能需要很长时间,即使执行本身很快。您的数据结构也可能有一个O(n)中的add方法

可能的解决办法: *找到一个真正的无等待解决方案。例如,优先处理线程。 *在执行它们之前,将它们全部添加到数据结构中

虽然可以这样工作,但强烈建议不要为这样的东西创建多个线程。正如David Lorenzo已经指出的那样,您应该使用线程执行器

我有一个循环,我在其中创建了数千个线程

这是个坏兆头。创建线程非常昂贵

假定您的程序创建了数千个线程,因为它有数千个任务要执行。诀窍是,将线程与任务分离。只创建几个线程,然后重新使用它们

这就是线程池为您所做的

了解
java.util.concurrent.ThreadPoolExecutor
类和相关类(例如
Future
)。它实现了一个线程池,很可能它提供了您需要的所有特性

如果您的需求足够简单,那么可以使用
java.util.concurrent.Executors
中的一种静态方法来创建和配置线程池。(例如,
Executors.newFixedThreadPool(N)
将创建一个新的线程池,其中正好有N个线程。)


如果您的任务都是受计算限制的,那么没有理由拥有比机器中CPU数量更多的线程。如果您的任务花费时间等待某些东西(例如,等待来自网络客户端的命令),那么创建多少线程的决定就变得更加复杂:这取决于这些线程使用了多少资源。您可能需要进行实验以找到正确的编号。

这里的线程引用是什么?提出问题可能是您的机器无法处理那么多线程,并且变得不稳定。如果不稳定,请使用执行器。我认为最好存储将来的线程引用,而不是线程引用。但不知道这是否会影响性能。所以我这样做了,结果如下:@davide lorenzo marino For 1.5mb文件线程计数| Time;1 | 1,42 ;2 | 1,20 ;4 | 1,13 ;5 | 1,09 ;6 | 1,09 ;8 | 1,13 ;4mb文件为10 | 1,07;2 | 6,16 ;5 | 5,50它比另一个文件大3倍,但慢6倍。池很好,但看起来仍然很慢