IllegalMonitorStateException en la función awaitTermination

Tengo un problema con el uso de hilos en Java (tengo poca experiencia con hilos en Java, pero mucho en C ++, así que entiendo el concepto básico de hilos). He usado código de ejemplo para hilos en Java, y el código es el siguiente:

        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() está reiniciando algunas máquinas remotas, y las máquinas no están conectadas de ninguna manera, los datos que se pasan a Runnable son la dirección IP de la máquina dada y el comando que se ejecuta localmente en esa máquina.

El siguiente error es el que obtengo al ejecutar este código:

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) 

Se genera una excepción al llamar a la función awaitTermination () del código anterior. Según tengo entendido, y de varios ejemplos que he visto, no debería haber ningún problema con este código.

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();
    }
}

El seguimiento indica que hay un error al llamar a la función mainLock.unlock (); pero como entiendo, solo el hilo principal ejecutará esa línea, por lo que no sé por qué obtengo IllegalMonitorStateException, y no hay otro código con respecto a los hilos en el programa (así que básicamente solo estoy usando el código de la biblioteca)

Agradecería cualquier ayuda, sé que hay muchas preguntas ya respondidas con respecto a este problema (esta excepción), pero no sé cuál es el problema aquí.

Respuesta 1

Tengo una situación en la que me gustaría un método peekWait en BlockingQueue. Describiría este método como recupera pero no elimina el encabezado de la cola, esperando si es necesario hasta que un elemento ...

Estoy haciendo un proyecto en Java usando la biblioteca PDFBOX-1.8.6 (es obligatorio). Mi pregunta es ¿Cómo puedo verificar que el archivo pdf de entrada tenga orientación vertical u horizontal? Cómo verificar / escanear retratos o ...

Quiero incluir un archivo test.txt en mi programa Java, pero no sé cómo incluir un archivo en NetBeans para una aplicación Java. Este es mi código: proyecto de paquete; import java.util. *; import java.io ....

Tengo el fragmento de pom.xml que intenta resolver la dependencia de fitbit: <repositorios> <repository> <name> FitBit GitHub Repo </name> <id & ...