es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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!

Tags:  , ,

Answer

  1. Avatar for 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() versus Thread.currentThread().wait(), generalmente se recomienda utilizar Thread.sleep() para intervalos de tiempo pequeños como los del código. El método wait() 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étodo wait() en un objeto sin obtener primero su monitor con synchronized. En este caso, no es necesario utilizar wait() 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.

Comments are closed.