我试图测试 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/