可以在一个线程内使用wait / notify吗? 我的意思是我有一个听众,在听到这个听众的那一刻,我想让一个线程做他的工作。我怎么能这样做?
更新:我的数据写在数据库中......并且每次调用监听器时都会写入。现在我创建的线程读取该数据并将其发送到某个地方.... 接下来......我得到了一些其他数据并做了同样的事情....另一个线程需要知道他读取的最后数据是什么,这样他就可以从他离开的地方开始阅读....
看看这里: using wait and notify within one thread 这是我的问题的样子.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);
????
当你通知thred时,他会在wait()??? Thx
之后继续执行该行答案 0 :(得分:14)
以下是两个不同线程之间并发的简单示例。在示例中,主线程启动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线程打印它。
根据您的需求进行调整,不应该太难。
答案 1 :(得分:3)
我有类似的问题。我创建了一个由两个线程使用的仲裁器(在你的情况下,它可以是监听器线程和你的任务线程): 监听器:
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();
}}
监听器和任务将自己与arbiters监视器同步。您可以调用仲裁队列或管道并存储日期以供消费吗?