我正在尝试测试番石榴并发包,如下所示。

我希望创建的线程池将执行“ 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中正常执行并完成任务的地方出错了?如何解决?

非常感谢。

最佳答案

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

为什么要得到IllegalMonitorStateException:这是因为您在执行程序上调用了wait,而没有在执行程序对象上隐式锁定。那对您在这里做没有意义。也许您将其与awaitTermination混淆了?


  布尔awaitTermination(长时间超时,
                         TimeUnit单位)
                           抛出InterruptedException
  
  阻塞直到关闭请求后所有任务完成执行,或者发生超时,或者当前线程被中断(以先发生者为准)。


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

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

10-10 21:48