У меня проблема с использованием потоков в Java (у меня мало опыта работы с потоками в Java, но многое в С++, поэтому я понимаю базовую концепцию потоков). Я использовал пример кода для потоков в Java, а следующий код:
ExecutorService executor = Executors.newFixedThreadPool(machines.size());
for (Machine m : machines) {
Runnable worker = new restartMachine(m.dataformachine());
executor.execute(worker);
}
executor.shutdown();
try {
executor.awaitTermination(15, TimeUnit.MINUTES);
} catch (InterruptedException e) {
e.printStackTrace();
}
restartMachine()
перезапускает некоторые удаленные машины, а машины не связаны каким-либо образом, данные, которые передаются Runnable, - это IP-адрес для данного компьютера и команда, которые затем выполняются локально на этом компьютере.
Ошибка, которую я получаю при выполнении этого фрагмента кода, следующая:
java.lang.IllegalMonitorStateException
at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:155)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1260)
at java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:460)
at java.util.concurrent.ThreadPoolExecutor.awaitTermination(ThreadPoolExecutor.java:1471)
Исключение вызывается при вызове функции awaitTermination() из приведенного выше кода. Насколько я понимаю, и из различных примеров, которые я видел, не должно быть никаких проблем с этим кодом.
public boolean awaitTermination(long timeout, TimeUnit unit)
throws InterruptedException {
long nanos = unit.toNanos(timeout);
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
try {
for (;;) {
if (runStateAtLeast(ctl.get(), TERMINATED))
return true;
if (nanos <= 0)
return false;
nanos = termination.awaitNanos(nanos);
}
} finally {
mainLock.unlock();
}
}
Трассировка указывает на то, что ошибка вызывает вызов функции mainLock.unlock(); но, как я понимаю, только основной поток собирается выполнить эту строку, поэтому я не знаю, почему я получаю IllegalMonitorStateException, и нет другого кода, касающегося потоков в программе (поэтому я в основном использую только код из библиотеки)
Я был бы признателен за любую помощь, я знаю, что на эту проблему уже задано много вопросов (это исключение), но я не знаю, в чем проблема.