【问题标题】:Using Threads in Loop在循环中使用线程
【发布时间】:2016-02-25 15:34:40
【问题描述】:

我有一个 for 循环需要执行 36000 次

for(int i=0;i<36000;i++)
{
}

是否可以使用多个线程以更快地同时执行循环

请建议如何使用它。

【问题讨论】:

  • 你想在这个循环中做什么?
  • 我正在尝试从网站的动态网页中获取数据并写入文件。这里 1 到 36000 是页码。
  • 多线程按0到36000的顺序执行?这样会更快吗?
  • @我想要的是 Thread1 正在执行 1,其中 Thread2 正在执行 2,而 Thread 3 正在再次执行 3 Thread1 正在执行 4 ...等等。由于它并行完成,我希望增加任务的速度
  • 检查您有多少个内核/处理器可用,通过创建线程数 = 内核/处理器数在它们之间平均分配工作。例如,使用 4 个内核,您将获得 4 个线程:第一个将处理 0-8999 的页面,第二个将处理 9000-17999 等...

标签: java


【解决方案1】:

如果您想要更明确的方法,您可以使用带有 Thread、Callable 或 Runnable 的线程池。有关示例,请参见我的回答: Java : a method to do multiple calculations on arrays quickly Thread won't naturally exit at end of run()

我不推荐使用 Java 的 Fork/Join,因为它们并没有人们宣传的那么好。性能相当差。相反,如果你想让它变得简单,我会使用 Java 8 的映射和并行流。使用此方法有多种选择。

IntStream.range(1, 4)
    .mapToObj(i -> "testing " + i)
    .forEach(System.out::println);

你会想调用 map( lambda )。 Java 8 终于带来了 lambda 函数。可以为流提供一个巨大的列表,但会对性能产生影响。 IntStream.range 会做你想做的事。然后你需要弄清楚你想要使用哪些新函数,比如过滤器、映射、计数、求和、减少等。你可能必须告诉它你希望它是一个并行流。请参阅这些链接。 https://docs.oracle.com/javase/tutorial/collections/streams/parallelism.html http://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/

经典方法并且仍然具有最佳性能的是使用线程池自己做: 基本上,您将创建一个 Runnable(不返回任何内容)或 Callable(返回结果)对象,它们将对池中的一个踏板执行一些工作。带有句柄调度的池,这对我们来说非常棒。 Java 在您使用的池上有几个选项。您可以在循环中创建 Runnable/Callable,然后将其提交到池中。池立即返回代表任务的 Future 对象。如果你有很多,你可以将 Future 添加到 ArrayList 中。将所有期货添加到列表后,循环它们并调用 future.get(),它将等待执行结束。请参阅上面的链接示例,它不使用列表,但执行我所说的所有其他操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 2011-02-13
    • 1970-01-01
    相关资源
    最近更新 更多