Pregunta

Tengo que llamar a un módulo de función tercera parte en un nuevo hilo. Por lo que he visto, la llamada sea completa rápidamente si todo ha ido bien o simplemente se cuelga para siempre encerrar el hilo. ¿Qué es una buena manera de empezar el hilo y hacer la llamada y espere unos segundos y si el hilo está todavía vivo, a continuación, suponiendo que está encerrado, de corte (o parada o abandonar) el hilo sin necesidad de utilizar cualquiera de los métodos obsoletos.

Tengo algo como esto por ahora, pero no estoy seguro si esto es la mejor manera de hacerlo y quiero evitar llamar Thread.stop (), ya que está en desuso. Gracias.

private void foo() throws Exception
{
        Runnable runnable = new Runnable()
        {

            @Override
            public void run()
            {
                    // stuff that could potentially lock up the thread.
            }
        };
        Thread thread;
        thread = new Thread(runnable);
        thread.start();
        thread.join(3500);
        if (thread.isAlive())
        {
            thread.stop();
            throw new Exception();
        }

}
¿Fue útil?

Solución

public void stop() {
        if (thread != null) {
           thread.interrupt();
        }
    }

Vea este enlace en Cómo detener un hilo, que cubre bien el tema

Otros consejos

No hay manera de hacer lo que quiere (sin condiciones). Por ejemplo, si las miradas stuff that could potentially lock up the thread. como esta, no hay manera de detenerlo, siempre por debajo de System.exit ():

public void badStuff() {
 while (true) {
  try {
   wait();
  }
  catch (InterruptedException irex) {
  }
 }
}

Cuando su aplicación se atasca, ejecute jstack (o utilizar el depurador). Tratar de averiguar qué se pega a la función y solucionarlo.

Me gustaría ver en el marco java.util.concurrent Executor y, específicamente, la interfaz Future<T>. Con éstos se abstraen en cierta medida de los caprichos de la java.lang.Thread, y se obtiene un buen desacoplamiento de lo que las tareas son de la forma en que se ejecutan (ya sea en un hilo separado, si el hilo proviene de una piscina o se crea una instancia de la mosca, etc.)

Una instancia futuro, al menos, le da isDone y métodos isCancelled.

El ExecutorService (subinterfaz de Executor) le da algunos medios de cierre de las tareas Destacadas. O visite el método ExecutorService.awaitTermination(long timeout, TimeUnit unit)

private void foo() throws Exception
{
        ExecutorService es = Executors.newFixedThreadPool(1);

        Runnable runnable = new Runnable()
        {

            @Override
            public void run()
            {
                    // stuff that could potentially lock up the thread.
            }
        };

        Future result = es.submit(runnable);

        es.awaitTermination(30, TimeUnit.SECONDS);

        if (!result.isDone()){
            es.shutdownNow();
        }

}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top