2011-12-20 19 views
11

Necesito leer los datos de una tabla cada minuto a través del subproceso & y luego realizar determinada acción.Trabajador Subproceso en Java

¿Debo simplemente iniciar un hilo & ponerlo en modo de suspensión durante 1 minuto, una vez que se realiza la tarea. Y a continuación, vuelva a comprobar si la tabla tiene datos, realizar la tarea de nuevo & ir a dormir durante 1 minuto ...

¿Es este el enfoque correcto? ¿Alguien puede proporcionarme un código de muestra en Java para hacer lo mismo?

Gracias!

Respuesta

20

Como sucede a menudo, las extensiones de Java 5 del paquete java.util.concurrent son una gran ayuda aquí.

Debe usar el ScheduledThreadPoolExecutor. Aquí es una pequeña (untestet) ejemplo:

class ToSomethingRunnable implements Runnable { 
    void run() { 
     // Add your customized code here to update the contents in the database. 
    } 
} 

ScheduledThreadPoolExecutor executor = Executors.newScheduledThreadPool(1); 
ScheduledFuture<?> future = executor.scheduleAtFixedRate(new ToSomethingRunnable(), 
    0, 1, TimeUnit.MINUTES); 

// at some point at the end 
future.cancel(); 
executor.shutdown(); 

Actualización:

Una ventaja de utilizar un ejecutor es que se puede añadir muchas tareas repetitivas de varios intervalos todas comparten el mismo threadpool un simple, pero apagado controlado

+1

+1: 'newScheduledThreadPool (1)' = 'newSingleThreadScheduledExecutor()' y 'executor.shutdown()' cancelará todas las tareas activas. –

+1

Una ventaja de usar un ejecutor es que puede agregar muchas tareas repetitivas de varios intervalos, todas compartiendo el mismo (s) hilo (s). (Y el cierre simple) –

+0

@PeterLawrey: Tienes razón. Me incorporé a la respuesta. – dmeister

0

Su enfoque es bueno. Puede continuar con su enfoque.

esta muestra le ayudará a hacer su tarea:

class SimpleThread extends Thread { 
    public SimpleThread(String str) { 
    super(str); 
    } 
    public void run() { 
    for (int i = 0; i < 10; i++) { 
     System.out.println(i + " " + getName()); 
     try { 
      // Add your customized code here to update the contents in the database. 

      sleep((int)(Math.random() * 1000)); 

     } catch (InterruptedException e) {} 
    } 
    System.out.println("DONE! " + getName()); 
} 
} 
+0

como alguien sugirió que las extensiones de Java 5 del paquete java.util.concurrent contienen una mejor soluciones a este problema. – dendini

1

Una alternativa para crear un hilo a sí mismo es utilizar el ExcecutorService, donde Executors.newScheduledThreadPool(1) crea una piscina thred de tamaño 1 y scheduleAtFixedRate tiene la firma : scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit);

public class ScheduledDBPoll 
{ 
    public static void main(String[] args) 
    { 
    ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 
    ScheduledFuture<?> sf = scheduler.scheduleAtFixedRate(
     new Runnable() { 
      public void run() { 
      pollDB(); 
      } 
     }, 
     1, 60,TimeUnit.SECONDS); 
    } 
} 
0

"¿Debo iniciar un hilo & lo puso en modo de reposo durante 1 minuto" Incluso si quieres quieres ir con rosca tradicional (no desea utilizar ejecutor Fremework) NO USAR EL SUEÑO para esperar propósito, ya que no liberará el bloqueo y es una operación de bloqueo. USE espera (tiempo de espera) aquí.

incorrecto Enfoque -

public synchronized void doSomething(long time) throws InterruptedException { 
    // ... 
    Thread.sleep(time); 
} 

enfoque correcto

public synchronized void doSomething(long timeout) throws InterruptedException { 
// ... 
    while (<condition does not hold>) { 
    wait(timeout); // Immediately releases the current monitor 
    } 
} 

es posible que desee comprobar enlace https://www.securecoding.cert.org/confluence/display/java/LCK09-J.+Do+not+perform+operations+that+can+block+while+holding+a+lock

Cuestiones relacionadas