Как использовать оповещение и ждать

Можно ли ждать / уведомлять в одном потоке? Я имею в виду, что у меня есть слушатель, и в тот момент, когда этот слушатель вызван, я хочу включить поток для выполнения его работы. Как я могу это сделать?

UPDATE: мои данные записываются в базу данных … и записываются каждый раз, когда вызывается слушатель. Теперь поток, который я создал, считывает эти данные и отправляет их где-то …. Далее … Я получаю некоторые другие данные И делать то же самое … Другая нить должна знать, каковы последние данные, которые он читал, чтобы он мог начать читать, откуда он ушел …

Взгляните сюда: использование wait и уведомление в одном потоке. Вот как выглядит моя проблема. THX

У меня есть следующее:

synchronized (syncToken) { try { syncToken.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("MyThread: " + s); 

В MyThread …. так что когда я делаю

 MyThread t = new MyThread(syncToken); t.start(); 

Я положил свою нить на ожидание … да?

И когда я это делаю:

 syncToken.notify(); 

Я возвращаю свой поток обратно … но выполнение следующей строки происходит после wait ()?

Я имею в виду это: System.out.println("MyThread: " + s); ????

Когда u уведомит об этом, он продолжает свое исполнение с линией после ожидания () Thx

Solutions Collecting From Web of "Как использовать оповещение и ждать"

Ниже приведен простой пример параллелизма между двумя разными потоками. В примере основной поток запускает поток MyThread и каждые 3 секунды он устанавливает данные в экземпляр MyThread, а затем MyThread печатает его. Идея состоит в том, чтобы синхронизировать объект, который вы wait от него, и notify в конце использования о других потоках, которые они могут использовать:

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; } } 

В этом примере основной поток устанавливает строку (каждые 3 секунды), а поток MyThread печатает ее.

Адаптируйте его к вашим потребностям, это не должно быть слишком сложно.

У меня была схожая проблема. Я создал арбитр, используемый двумя потоками (в вашем случае это может быть поток слушателей и поток задач): listenener:

 arbiter.waitConsumer(); // prepare data arbiter.dataLoaded(); 

Тема задачи:

 while(true){ arbiter.waitProducer(); // consume data arbiter.dataConsumed(); } в while(true){ arbiter.waitProducer(); // consume data arbiter.dataConsumed(); } 

арбитр:

 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(); }} в 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(); }} в 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(); }} 

Слушатель и задача будут синхронизировать себя с монитором арбитров. Возможно, вы можете позвонить в свою очередь или трубку арбитра и сохранить дату для ее потребления?