gpt4 book ai didi

java - 等待池完成线程

转载 作者:行者123 更新时间:2023-12-01 08:55:18 25 4
gpt4 key购买 nike

    StopWatch sw = new StopWatch();
sw.start();
ExecutorService executor = Executors.newFixedThreadPool(MYTHREADS);

for (int i = 0; i < MYTHREADS; i++) {
Runnable worker = new SingleConnectionRunnable();
executor.execute(worker);
}

sw.stop();
System.out.println("total time"+sw.toString());
sw.reset();
sw.start();

for (int i = 0; i < MYTHREADS; i++) {
Runnable worker2 = new PooledConnectionRunnable();
executor.execute(worker2);
}
executor.shutdown();
executor.awaitTermination(Integer.MAX_VALUE, TimeUnit.SECONDS);
while (!executor.isTerminated()) {

}

sw.stop();
System.out.println("total time"+sw.toString());

我正在尝试对上面的代码运行一些性能测试。我试图在不同的 Runnable 上使用相同的执行器并测量时间。但这并不完全有效。第一个“总时间”不正确,以毫秒为单位。

我想打印第一个循环的耗时,然后打印第二个循环。不知道如何等待执行器完成第一个然后重新启动执行器。

完成此任务的正确方法是什么?

最佳答案

首先,awaitTerminationblock直到所有任务终止。是否有任何特殊原因导致您在等待后使用 while 循环检查 70 years

无论如何,要回答您的问题,为了等待第一次运行完成,您应该使用 CountDownLatch 来发出每个线程完成的信号,并在主线程中等待它们直到它们完成。您还可以使用 CyclicBarrier 等待所有线程在开始计时之前准备就绪,如下所示:

...
CountDownLatch latch = new CountDownLatch(MYTHREADS);
CyclicBarrier cb = new CyclicBarrier(MYTHREADS, new Runnable() {
@Override public void run() {
sw.start();
}
});

for (...) {
Runnable worker = ...
executor.execute(new Runnable() {
@Override public void run() {
try {
cb.await();
} catch (Exception e) {
throw new RuntimeException(e);
}

worker.run();
latch.countDown();
}
});
}

latch.await();
sw.stop();
...

我将 sw.start() 移至 for 循环的开头,以避免测量设置的对象分配开销(可能无论如何都不会测量,因为它以毫秒为单位)。

您还可以重置两个并发类以运行无限次。

关于java - 等待池完成线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42069056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com