我在 Java 中使用线程时遇到问题(我对 Java 中的线程几乎没有经验,但在 C++ 中却很多,所以我了解线程的基本概念)。我在 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,并且程序中没有关于线程的其他代码(所以我基本上只使用库中的代码)
我会很感激任何帮助,我知道关于这个问题已经回答了很多问题(这个例外),但我不知道这里有什么问题。