2011-05-28 34 views
5

En una aplicación de swing, me gustaría volver a utilizar un hilo generado en lugar de crear uno nuevo para atender las solicitudes. Esto se debe a que las solicitudes llegarían en cortos intervalos de tiempo y el costo de crear un nuevo hilo para cada solicitud podría ser alto.Usar sleep() e interrupt() para reutilizar thread

estoy pensando en usar la interrupción() y sleep() métodos para hacer esto que a continuación y me gustaría saber los posibles problemas de rendimiento con el código:

public class MyUtils { 
    private static TabSwitcherThread tabSwitcherThread = null; 

    public static void handleStateChange(){ 
     if(tabSwitcherThread == null || !tabSwitcherThread.isAlive()){ 
      tabSwitcherThread = new TabSwitcherThread(); 
      tabSwitcherThread.start(); 
     } 
     else 
      tabSwitcherThread.interrupt();  
    } 

    private static class TabSwitcherThread extends Thread{ 
     @Override 
     public void run() { 
      try { 
       //Serve request code 

       //Processing complete, sleep till next request is received (will be interrupted) 
       Thread.sleep(60000); 
      } catch (InterruptedException e) { 
       //Interrupted execute request 
       run(); 
      } 

      //No request received till sleep completed so let the thread die   
     } 
    } 
} 

Gracias

+1

En realidad, creo que eres TabSwitcherThread obtendrá excepción stackoverflow, tarde o temprano, porque tiene una llamada recursiva en su método run() :) – Alvin

Respuesta

4

Creo que lo que estás buscando es un ThreadPool. Java 5 y superior viene con ThreadPoolExecutor. Le sugiero que use lo que se proporciona con Java en lugar de escribir el suyo, por lo que puede ahorrarse mucho tiempo y pelos.

Por supuesto, si tiene que hacerlo de la manera que describió (oye, a veces el requisito comercial nos dificulta la vida), utilice wait() y notify() como Jon sugirió. No usaría sleep() en este caso porque tiene que especificar el tiempo de espera, y nunca se sabe cuándo entrará la próxima solicitud. Tener un hilo que sigue despertando y luego volver a dormir parece un poco desperdicio de ciclo de CPU para mí .

Aquí hay un nice tutorial sobre el ThreadPoolExecutor.

EDIT:

Aquí es un poco de código de ejemplo:

public class MyUtils { 
    private static UIUpdater worker = null; 
    private static ExecutorService exeSrv = Executors.newFixedThreadPool(1); 

    public static void handleStateChange(){ 
     if(tabSwitcherThread == null || !tabSwitcherThread.isAlive()){ 
      worker = new UIUpdater(); 
     }  

     //this call does not block 
     exeSrv.submit(worker, new Object());  
    } 

    private static class UIUpdater implements Runnable{ 
     @Override 
     public void run() { 

      //do server request and update ui. 
     } 
    } 
} 
10

I wouldn No use sleep() y interrupt() - Usaría wait() y notify() si tuviera que hacerlo.

Sin embargo, ¿hay alguna necesidad real de hacer esto en lugar de usar un ThreadPoolExecutor que pueda manejar la reutilización de hilo para usted? O tal vez usar un BlockingQueue en una forma de productor/consumidor?

Java ya proporciona suficientes bloques de construcción de alto nivel para esto que no debería tener que bajar a este nivel usted mismo.

+0

Gracias por la respuesta. Esta es una pequeña aplicación Java y no quiero tener 'n' hilos agrupados para atender las solicitudes. Básicamente, en un momento habría una solicitud única entrando. La situación es como en un área de texto donde el usuario escribe algo y esto necesita ser procesado. No puedo hacerlo en el mismo hilo porque haría que la UI se congelara y, por lo tanto, necesitaría un thead separado. Para esto, me gustaría tener un hilo dedicado y evitar crear nuevos, ya que he experimentado retrasos considerables en la creación de un nuevo hilo. ¡Gracias! – skk

+1

@skk ¿Qué pasa con un grupo de 1 hilo? :). He modificado mi respuesta con un código de ejemplo de cómo puede utilizar el marco simultáneo de Java. Tomé prestada parte de tu código, espero que no te importe. – Alvin

+2

@skk: una cola productor/consumidor haría eso por usted, o un 'ThreadPoolExecutor' con un hilo. –