如何使用通知和等待
可以等待/通知在一个线程内使用吗? 我的意思是我有一个监听者,当那个监听者被调用的时候,我想启用一个线程来完成他的工作。我该怎么做?如何使用通知和等待
更新:我的数据写入数据库中......每次调用监听器时写入数据。现在,我创建的线程将读取该数据并将其发送到某处...... Next ...我看到一些数据,做同样的事情....其他线程需要知道什么是他读了,这样他就可以开始从他离开的地方读取最后一个数据....
采取这里看看: using wait and notify within one thread 这是我的问题怎么看like.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();
我得到我的线程回到正轨....但下一行的执行是等待一前一后()?
我的意思是这样的:System.out.println("MyThread: " + s);
????
当U通知thred做他继续他的等待后线()??? THX
以下是两个不同的线程之间的并发的一个简单的例子执行。在这个例子中,主线程启动一个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线程打印它。
使其适应您的需求,它不应该是太辛苦了。
我有类似的问题。我创建了两个线程使用的仲裁器(在你的情况下,可以监听线程,你的任务线程): 听众:
arbiter.waitConsumer();
// prepare data
arbiter.dataLoaded();
任务线程:
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();
}}
监听器和任务将自己同步仲裁器监视器。大概你可以打电话给你的仲裁队列或管道并存储日期以供消费吗?
[在一个线程中使用wait和notify]可能的重复(http://stackoverflow.com/questions/5915449/using-wait-and-notify-within-one-thread) – 2011-05-06 19:56:02