【发布时间】: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