实现多个并发线程的最佳方法是在执行过程中返回结果?

时间:2015-03-25 06:41:54

标签: java concurrency

我在负载测试工具中实现以下功能,以模拟目标应用程序的重负载:

以并发方式启动多个线程以执行相同类型的操作。

每个线程将循环n次。在每个循环结束时,测试结果可用并添加到列表中,该列表在所有循环完成运行后返回。

我目前正在使用CallableFuture,并且在所有线程完成运行后将所有线程返回的结果列表放入另一个列表中并将Future提供给我。问题是如果程序的执行中断,我可能会失去可用的东西。我希望能够保存完成循环中可用的结果,同时线程仍在处理剩余的循环。

Java并发库中是否有适合此目的的东西?或者我正在构建的负载测试功能有更好的设计吗?

提前致谢!

2 个答案:

答案 0 :(得分:2)

您可以在结果发生时将结果传递给BlockingQueue。这可以由另一个线程或首先触发任务的线程拾取。

答案 1 :(得分:-1)

java.util.concurrent.CyclicBarrier类是一种同步机制,可以同步通过某种算法进行的线程。换句话说,它是一个障碍,所有线程必须等待,直到所有线程都到达它,然后任何线程才能继续。

创建CyclicBarrier

创建CyclicBarrier时,指定在释放它们之前要等待多少个线程。以下是创建CyclicBarrier的方法:

CyclicBarrier barrier = new CyclicBarrier(2);

等待CyclicBarrier

以下是线程在CyclicBarrier中的等待方式:

barrier.await();

您还可以为等待线程指定超时。当超时已经过去时,线程也被释放,即使并非所有N个线程都在CyclicBarrier上等待。以下是指定超时的方法:

barrier.await(10, TimeUnit.SECONDS);

等待线程在CyclicBarrier等待,直到:

最后一个线程到达(调用await()) 线程被另一个线程中断(另一个线程调用它的interrupt()方法) 另一个等待线程被中断 在CyclicBarrier等待时,另一个等待线程超时 CyclicBarrier.reset()方法由一些外部线程调用。