java - guava ThreadPool+CountDownLatch 遇到IllegalMonitorStateException

标签 java threadpool guava wait countdownlatch

我试图测试 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();

然后程序卡在那里,没有停止。那么我在 ThreadPool 中优雅地执行并完成任务哪里出错了呢?如何解决?

非常感谢。

最佳答案

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

关于java - guava ThreadPool+CountDownLatch 遇到IllegalMonitorStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53684321/

相关文章:

Java 8流findFirst抛出NPE,无法从流中过滤掉非空对象

java - 如何使用异步和使用多线程在Java中获取列表列表的交集

Java 任务队列、线程池和带有回调的线程,用于通知新任务何时可以启动

python - 使用 ThreadPool Python 时的最大池大小

java - ListenableScheduledFuture 和 ListeningScheduledExecutorService

java - 如何扫描类的注解?

java - 需要选择更新类似 Guava 缓存的功能

java - hsqldb 内部事件日志配置

Ruby:有关于线程池的 gem 吗?

java - Spring MVC : Dynamic Param Name or Param Name using Regex?