在循环中使用线程

时间:2016-02-25 06:59:04

标签: java

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

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

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

请建议如何使用它。

1 个答案:

答案 0 :(得分:0)

如果需要更明确的方法,可以使用具有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会做你想要的。然后你需要弄清楚你想要使用哪些新函数,如filter,map,count,sum,reduce等。你可能需要告诉它你希望它是一个并行流。请参阅这些链接。 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(),它将等待执行结束。请参阅上面的链接示例,该示例不使用列表,但执行我说的所有其他操作。