2010-12-23 12 views
5

Hola soy un principiante, lo siento por mi pregunta si suena ingenuo.¿Cómo implementar el detector de eventos en el fondo del programa principal en Java?

Quiero implementar un hilo que se ejecuta en segundo plano y escucha todo el tiempo. Al escuchar me refiero, digamos que mantiene el control en un valor devuelto por el hilo principal y si el volumen excede cierta cifra, ejecuta algún método o, por ejemplo, sale del programa.

Si pudiera darme una idea o al menos referirme a algo útil, sería genial.

Respuesta

2

No desea que este subproceso se ejecute en un bucle, sondeando continuamente el valor, porque eso desperdiciará el procesamiento.

Idealmente, el oyente recibiría una notificación activa cuando el valor hubiera cambiado. Esto requeriría que cualquier código que modifique el valor monitoreado llame a un método especial. Puede que no sea necesario que el oyente se ejecute en un hilo separado; dependerá de lo que haga el oyente cuando se le notifique.

Si el código que modifica el valor no puede modificarse, lo mejor que puede hacer es verificar el valor a intervalos. No verá un cambio de inmediato, y es posible que pueda perder todos los cambios porque el valor está cambiando varias veces durante un intervalo.

¿Cuál de estas soluciones es la mejor para su situación?

+0

Gracias por su respuesta. Estaba pensando en implementar un ciclo inicialmente. En realidad estoy ejecutando un proceso externo a través de la línea de comandos de Windows, y a cambio leo un valor que debo seguir. Obtengo la respuesta en formato de cadena y la vuelvo a enviar a int para aplicar los controles. Estaba pensando en seguir llamando a este proceso externo a través de Runtime.getRuntime(). Exec() en un bucle y verificando el valor a intervalos regulares, digamos cada 2 segundos. No es tan sensible estar en mseg. ¿Crees que es una buena idea hacerlo así? –

+0

@Sara: su plan parece una forma adecuada de manejarlo. Yo recomendaría mirar el ['ScheduledExecutorService'] (http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html) para crear un hilo que ejecutará esta comprobación en un intervalo fijo. – erickson

+0

[Esta pregunta de StackOverflow] (http://stackoverflow.com/questions/426758/running-a-java-thread-in-intervals) y la respuesta aceptada brindan un buen ejemplo de cómo usar el 'ScheduledExecutorService'. – erickson

1

Puede encontrar información sobre el uso de hilos en Java Tutorials (si es nuevo en concurrencia en Java, le recomiendo leer este tutorial primero). Especialmente this section puede ser útil para usted (muestra cómo crear y comenzar un nuevo hilo).

+0

muchas gracias. Eso fue realmente útil. –

0

Creo que se puede utilizar simplemente un componente de interfaz gráfica de usuario para el hilo principal como un JTextField, entonces leer sobre Manejo de Eventos y usted será fácilmente capaz de escuchar el cambio de estado de los valores de entrada de campo de texto.

+0

No quiero crear instancias de objetos GUI para procesar el desperdicio en algo que no necesito. Estoy buscando una solución simple. –

+0

Puedes mirar la respuesta de rodion entonces. – Ahmed

1

Si simplemente necesita sondear el resultado de otro hilo intente con el paquete java.util.concurrent como lo sugiere @Piotr. Aquí hay un ejemplo concreto de cómo puede hacer esto:

import java.util.concurrent.*; 

class Main{ 
    public static void main(String[] args) throws Exception{ 
     //Create a service for executing tasks in a separate thread 
     ExecutorService ex = Executors.newSingleThreadExecutor(); 
     //Submit a task with Integer return value to the service 
     Future<Integer> otherThread = ex.submit(new Callable<Integer>(){ 
      public Integer call(){ 
       //do you main logic here 
       return 999;//return the desired result 
      } 
     } 

     //you can do other stuff here (the main thread) 
     //independently of the main logic (in a separate thread) 

     //This will poll for the result from the main 
     //logic and put it into "result" when it's available 
     Integer result = otherTread.get(); 

     //whatever you wanna do with your result 
    } 
} 

Espero que esto ayude.

Cuestiones relacionadas