Problemas de multihilo
Estoy tratando de involucrarme más en el uso de múltiples hilos en Java, pero mis esfuerzos se han detenido en este código:
package io.nlaz.test.commands;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.entity.Player;
import java.util.List;
public class test implements TabExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
try {
Thread a24 = new Thread(() -> {
try {
Thread.sleep(1000);
sender.sendMessage("2");
Thread.sleep(2000);
sender.sendMessage("4");
} catch (Exception e) {
e.printStackTrace();
}
});
Thread a35 = new Thread(() -> {
try {
Thread.sleep(3000);
sender.sendMessage("3");
Thread.sleep(2000);
sender.sendMessage("5");
} catch (Exception e) {
e.printStackTrace();
}
});
sender.sendMessage("1");
a24.start();
a35.start();
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
@Override
public List<string> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
return null;
}
}
Cuando se ejecuta el código, se supone que debe enviar un mensaje contando hasta 5 cada segundo. Pero cuando se ejecuta, llega hasta 2, luego espera a que el hilo a24 termine y luego ejecuta a35. He buscado posibles soluciones a esto, sin embargo, todas ellas llevan a que el hilo principal se pausa o al mismo problema que ya tengo.
Me di cuenta de que parte del problema podría ser el uso de Thread.sleep()
en lugar de algo como Thread.currentThread().wait()
. Sin embargo, cuando uso ese método, obtengo un error que dice java.lang.IllegalMonitorStateException: current thread is not owner
. Cualquier sugerencia es bienvenida, ¡gracias!
davy.ai
Parece que el problema con el código es que el hilo principal está bloqueado mientras espera a que los dos hilos finalicen. Una posible solución sería utilizar el método
join()
en ambos hilos después de iniciarlos, lo cual haría que el hilo principal espere a que finalicen antes de continuar.En cuanto al uso de
Thread.sleep()
versusThread.currentThread().wait()
, generalmente se recomienda utilizarThread.sleep()
para intervalos de tiempo pequeños como los del código. El métodowait()
se utiliza típicamente en conjunción con la sincronización y la señalización entre hilos.En cuanto al error
java.lang.IllegalMonitorStateException: current thread is not owner
, este ocurre cuando se llama al métodowait()
en un objeto sin obtener primero su monitor consynchronized
. En este caso, no es necesario utilizarwait()
y hacerlo probablemente causaría más problemas.En resumen, utilizar
join()
para esperar a que los hilos finalicen debería solucionar el problema actual sin introducir nuevos.