guava ThreadPool+CountDownLatch 遇到IllegalMonitorStateException
guava ThreadPool+CountDownLatch encounters IllegalMonitorStateException
我正在尝试测试 guava 并发包,如下所示。
我希望创建的线程池会执行"Runnable" class实例,然后等待终止。
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中优雅的执行并完成任务哪里错了呢?如何解决?
非常感谢。
的观察是正确的,我 +1。要修复它,您可以添加另一个任务,例如您传递给 execute 方法的 Runnable。
为什么你会得到 IllegalMonitorStateException:这是因为你在执行器上调用了 wait 而没有持有执行器对象上的隐式锁。你在这里做的任何事情都没有意义。也许您将它与 awaitTermination 混淆了?
boolean awaitTermination(long timeout,
TimeUnit unit)
throws InterruptedException
Blocks until all tasks have completed execution after a shutdown request, or the timeout occurs, or the current thread is interrupted, whichever happens first.
但对于这种情况,只需在执行程序上调用关闭,这样它就会知道没有新任务到来,并且一旦 运行 任务完成,它就可以终止工作线程。
你不应该等待执行者;闩锁是您的同步机制。而且你的 latch await 永远不会完成,因为你只倒计时一次(你执行一个任务来倒计时,但你的 latch 被初始化为 2)。
我正在尝试测试 guava 并发包,如下所示。
我希望创建的线程池会执行"Runnable" class实例,然后等待终止。
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中优雅的执行并完成任务哪里错了呢?如何解决?
非常感谢。
为什么你会得到 IllegalMonitorStateException:这是因为你在执行器上调用了 wait 而没有持有执行器对象上的隐式锁。你在这里做的任何事情都没有意义。也许您将它与 awaitTermination 混淆了?
boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException
Blocks until all tasks have completed execution after a shutdown request, or the timeout occurs, or the current thread is interrupted, whichever happens first.
但对于这种情况,只需在执行程序上调用关闭,这样它就会知道没有新任务到来,并且一旦 运行 任务完成,它就可以终止工作线程。
你不应该等待执行者;闩锁是您的同步机制。而且你的 latch await 永远不会完成,因为你只倒计时一次(你执行一个任务来倒计时,但你的 latch 被初始化为 2)。