Don';我不知道如何在Java中使用wait()和notify()

Don';我不知道如何在Java中使用wait()和notify(),java,android,wait,notify,Java,Android,Wait,Notify,我想在一个线程中做一些东西,返回他作为字符串所做的事情,我想等待这个字符串做其他事情。我一直在读关于wait()和notify()的书,但我不明白。有人能帮我吗 这里我创建了执行操作的线程 new Thread( new Runnable() { @Override public void run() { synchronized(mensaje) { try { mensaje.wait();

我想在一个线程中做一些东西,返回他作为字符串所做的事情,我想等待这个字符串做其他事情。我一直在读关于
wait()
notify()
的书,但我不明白。有人能帮我吗

这里我创建了执行操作的线程

new Thread(

new Runnable() {

    @Override
    public void run() {

        synchronized(mensaje) {

            try {
                mensaje.wait();
                mensaje = getFilesFromUrl(value);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }

}).start();
我在这里等待字符串mensaje更改

new Thread(

new Runnable() {

    @Override
    public void run() {

        synchronized(mensaje) {

            try {
                mensaje.wait();
                mensaje = getFilesFromUrl(value);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }

}).start();
如果字符串不是“”,则显示一个按钮和一些文本

synchronized(mensaje) {

    if (mensaje.equals("")) {

        try {
            mensaje.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

    btnOk.setVisibility(View.VISIBLE);
    lblEstado.setText(mensaje);
}
所有这些东西都在一个方法中

notify()
notifyAll()
wait()
基本上是这样工作的:

当您调用
wait()
时,它会释放同步块使用的互斥锁,并将当前线程置于队列中休眠

notify()
从队列前端抓取一个等待的线程。该线程重新获取互斥并继续运行

notifyAll()
唤醒队列中的所有线程

这里使用一些伪代码(更清楚地说,缺少异常处理等):

编辑: 或者像Thilo写的那样,先看java.util.concurrent。您的用例可能已经有现成的解决方案。那么就不需要使用低级构造了

更正:对于您的用例,有一个现成的解决方案:


和相应的执行器。

查看并发UTIL。Callable和Future是这里需要了解的主要接口。你到底有什么问题?哎呀,我忘了写这个问题了…它说在notify之前对象没有被线程锁定(notify()在mensaje=getFilesFromUrl(value)之后;但我忘了写这篇文章了…)好吧,看起来很简单,但不起作用,只是什么都不做。我只想禁用一些按钮,并在线程活动后启用它们。。。但事情越来越复杂了!我在代码中看到的一个问题是,两个线程都调用wait()。两个线程都使用notify()?否则,这将导致线程阻塞并等待永远不会出现的notify()。编辑:我刚刚注意到你上面的评论。是否从同步块内部调用了notify()?如果你打电话给notify时不拿着显示器,它就不工作了。这是一个dind没有意识到的错误,但我无法输入新代码。。。我从主线程调用wait(),从新线程调用notify(),看看