java - 等待池完成线程

标签 java multithreading executorservice

    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/

相关文章:

java - 缓存整个表

java - 如何让特定线程进入休眠状态()?

java - 我们请求长时间运行,UI 在响应准备好时超时

java - 当 ThreadPoolExecutor 的所有任务都完成执行那里的作业时插入数据库

java - Google 身份验证服务迁移 - 如何确保该过程成功完成?

java - Maven 与查询 DSL 集成

java - 与Java PriorityQueue相关的困惑

Java isAlive() 和 join()

java - GCP 上的多线程 (ExecutorService) Java

java - ExecutorService:awaitTermination VS while 循环