【问题标题】:guava ThreadPool+CountDownLatch encounters IllegalMonitorStateExceptionguava ThreadPool+CountDownLatch 遇到 IllegalMonitorStateException
【发布时间】:2018-12-08 16:04:27
【问题描述】:

我正在尝试测试 guava 并发包,如下所示。

我希望创建的线程池会执行“Runnable”类实例,然后等待终止。

import com.google.common.util.concurrent.ThreadFactoryBuilder;
import java.util.concurrent.*;
public class MyTest {
    public static void main(String [] args) {
        final CountDownLatch latch = new CountDownLatch(2);
        ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("UseCountDownLatch").build();
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                10,
                10,
                100,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(1),
                namedThreadFactory);
        executor.execute(new Runnable() {
            @Override
            public void run() {
                latch.countDown();
            }
        });
        try {
            executor.wait();
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

但实际上,它会打印:

Exception in thread "main" java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:502)
at UseCountDownLatch.main(MyTest.java:28)

如果我删除

的行
executor.wait();

然后程序挂在那里,没有停止。那么我在哪里错在优雅地执行和完成线程池中的任务呢?如何解决?

非常感谢。

【问题讨论】:

    标签: java threadpool guava wait countdownlatch


    【解决方案1】:

    您不应该等待执行人;闩锁是您的同步机制。而且你的闩锁等待永远不会完成,因为你只倒计时一次(你执行一项任务来倒计时,但你的闩锁被初始化为 2)。

    【讨论】:

      【解决方案2】:

      you haven't incremented the count for the countdownLatch enough 的观察是正确的,我 +1。要修复它,您可以添加另一个任务,例如传递给 execute 方法的 Runnable。

      为什么你会得到 IllegalMonitorStateException:这是因为你在 executor 上调用了 wait 而没有在 executor 对象上持有隐式锁。这对你来说没有任何意义。也许你把它和awaitTermination混淆了?

      boolean awaitTermination(长时间超时, 时间单位) 抛出 InterruptedException

      在关闭请求后阻塞,直到所有任务完成执行,或发生超时,或当前线程被中断,以先发生者为准。

      但是对于这种情况,只需在执行程序上调用 shutdown,这样它就会知道没有新任务即将到来,并且一旦正在运行的任务完成,它就可以终止工作线程。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-06
        • 1970-01-01
        • 1970-01-01
        • 2011-08-17
        • 2013-08-15
        相关资源
        最近更新 更多