Я пытался протестировать одновременный пакет гуавы, как показано ниже.
Я ожидаю, что созданный пул потоков выполнит экземпляр класса "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?Как это исправить?
Спасибо большое.