Cómo usar notificar y esperar
¿Se puede esperar / notificar se utiliza dentro de un hilo? Soy malo que tengo un oyente y en el momento en que el oyente se llama quiero habilitar un hilo para hacer su trabajo. ¿Cómo podría hacer eso?
Mis datos se escriben en una base de datos … y se escribe cada vez que el oyente es llamado. Ahora el hilo que he creado lee los datos y lo envía a algún lugar …. A continuación … Tengo algunos otros datos Y hacer lo mismo …. El otro hilo necesita saber cuál fue el último dato que lo leyó para que pueda empezar a leer desde donde salió ….
- Afinidad de hilo para Android
- ¿Es legal llamar al método de inicio dos veces en el mismo hilo?
- ¿Cómo textView.setText de hilo?
- Pasar un mensaje del hilo a la interfaz de usuario de actualización
- ¿Se asignan automáticamente nuevos subprocesos a un núcleo de CPU diferente en Java?
Echa un vistazo aquí: usando esperar y notificar dentro de un hilo Así es como se ve mi problema.Thx
Tengo lo siguiente:
synchronized (syncToken) { try { syncToken.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("MyThread: " + s);
En MyThread
…. así que cuando lo hago
MyThread t = new MyThread(syncToken); t.start();
Puse mi hilo en espera … ¿sí?
Y cuando hago esto:
syncToken.notify();
Tengo mi hilo de nuevo en la pista …. pero la ejecución de la siguiente línea es la que después de esperar ()?
Quiero decir esto: System.out.println("MyThread: " + s);
????
Cuando se notifica a un thred no sigue su ejecución con la línea después de esperar () Thx
- Llamada desde una excepción de hilo incorrecto
- Cómo crear un hilo en Android NDK?
- Método runOnUiThread () para Android
- Android AsyncTask.THREAD_POOL_EXECUTOR vs ThreadPool personalizado con Runnables
- Android Webview loadUrl no funciona cuando viene de un hilo de trabajo
- Comunicación multihilo: ¿qué tan bueno es el uso de variables atómicas como AtomicInteger? ¿Por qué no hay AtomicFloat?
- Android kill thread específico en evento barra de acción
- Tema Android tarea de seguridad
El siguiente es un ejemplo simple de concurrencia entre dos subprocesos diferentes. En el ejemplo, el subproceso principal inicia un subproceso MyThread
y cada 3 segundos establece un dato en la instancia MyThread y luego MyThread lo imprime. La idea es tener un objeto sincronizado que usted wait
en él y notify
al final del uso a otros hilos que puedan usarlo:
Test.java:
package stack; public class Test { public static void main (String args[]) { Object syncToken = new Object(); MyThread t = new MyThread(syncToken); t.start(); for (int i = 0; i < 10; i++) { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized(syncToken) { t.setText("Iteration " + i); syncToken.notify(); } } } }
MyThread.java:
package stack; public class MyThread extends Thread{ String s; Object syncToken; public MyThread(Object syncToken) { this.s = ""; this.syncToken = syncToken; } public void run() { while(true) // you will need to set some condition if you want to stop the thread in a certain time... { synchronized (syncToken) { try { syncToken.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("MyThread: " + s); } } public void setText(String s) { this.s = s; } }
En este ejemplo, el subproceso principal establece una cadena (cada 3 segundos) y el subproceso MyThread lo imprime.
Adaptarlo a sus necesidades, no debería ser demasiado difícil.
Tuve un problema similar. He creado un árbitro utilizado por dos hilos (en su caso, puede ser hilo de los oyentes y su hilo de la tarea): listener:
arbiter.waitConsumer(); // prepare data arbiter.dataLoaded();
Hilo de tareas:
while(true){ arbiter.waitProducer(); // consume data arbiter.dataConsumed(); }
árbitro:
public class Arbiter { private boolean dataLoaded = false; public synchronized void waitProducer(){ while(!dataLoaded){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } public synchronized void waitConsumer(){ while(dataLoaded){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } public synchronized void dataLoaded(){ dataLoaded = true; notify(); }public synchronized void dataConsumed(){ dataLoaded = false; notify(); }}
El oyente y la tarea se sincronizan themselfes contra el monitor de los árbitros. Probablemente usted puede llamar a su cola árbitro o tubería y la fecha de almacenamiento para consumir en ella?
- CoordinatorLayout Toolbar invisible en entrar hasta full height
- Phonegap El teclado Android cubre los elementos de entrada desplazamiento está deshabilitado