【问题标题】:Java Thread storingJava 线程存储
【发布时间】:2016-01-05 14:51:54
【问题描述】:

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

我检查并存储线程会降低我的应用程序的速度。

它来自我的循环:

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 个等等? (如果是,那么如何?)

【问题讨论】:

  • 这里的线程引用是什么?
  • 给出this 的问题可能是您的机器无法处理那么多线程并且变得不稳定。
  • 如果不是,请使用 Executor。而且我相信最好存储 Future 而不是线程引用。不知道这是否会影响性能。

标签: java multithreading


【解决方案1】:

考虑到拥有非常多的线程数并不是很有用。

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

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

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

List<Record> records = ...;

ExecutorService executor = Executors.newFixedThreadPool(10);

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

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

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

【讨论】:

  • 所以我这样做了,结果如下:@davide-lorenzo-marino 对于 1.5mb 文件线程数 |时间 ;1 | 1,42 ;2 | 1,20 ;4 | 1,13 ;5 | 1,09 ;6 | 1,09 ;8 | 1,13 ;10 | 1,07 对于 4mb 文件;2 | 6,16 ;5 | 5,50 它比另一个文件大 3 倍,但速度慢 6 倍。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    我有一个循环,我创建了数千个线程...

    这是一个不好的迹象。创建线程很昂贵。

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

    这就是 线程池 为您做的事情。

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

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

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

    【讨论】:

    • 游泳池很棒,但看起来还是很慢
    猜你喜欢
    • 2017-11-29
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 2011-10-12
    相关资源
    最近更新 更多