如何使用通知和等待

时间:2011-05-06 19:53:53

标签: android database multithreading

可以在一个线程内使用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

之后继续执行该行

2 个答案:

答案 0 :(得分:14)

以下是两个不同线程之间并发的简单示例。在示例中,主线程启动MyThread线程,并且每隔3秒将数据设置到MyThread实例,然后MyThread打印它。我们的想法是在其使用结束时将waitnotify上的同步对象提供给他们可以使用的其他线程:

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监视器同步。您可以调用仲裁队列或管道并存储日期以供消费吗?