【问题标题】:Don't know how use wait() and notify() in Java [duplicate]不知道如何在 Java 中使用 wait() 和 notify() [重复]
【发布时间】:2013-05-13 11:49:53
【问题描述】:

我想在一个线程中做一些事情,将他所做的事情作为字符串返回,我想等待那个字符串做其他事情。我一直在阅读有关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 更改

如果字符串不是“”,那么我会显示一个按钮和一些文本

synchronized(mensaje) {

    if (mensaje.equals("")) {

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

    }

    btnOk.setVisibility(View.VISIBLE);
    lblEstado.setText(mensaje);
}

所有这些东西都在一个方法中

【问题讨论】:

  • 看看并发工具。 Callable 和 Future 是要了解的主要接口。
  • 你到底有什么问题?
  • Ops,我忘记写问题了...
  • 表示对象在 notify 之前没有被线程锁定(notify() 是在 mensaje = getFilesFromUrl(value) 之后;但我忘记为这篇文章写了...)

标签: java android wait notify


【解决方案1】:

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

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

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

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

在这里使用它是一些伪代码(缺少异常处理等更清楚一点):

// in the thread that is supposed to wait
synchronized {
    while(!someCondition) {
        wait();
    }
    // At this point the other thread has made the condition true and notified you.
}


// In the other thread
synchronized {
    // Do something that changes someCondition to true.
    notifyAll();
}

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

更正:针对您的用例有现成的解决方案: http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html

和相应的执行者。

【讨论】:

  • 好吧,看起来很简单,但是没用,就是什么都没做。我只是想禁用一些按钮并在线程活动之后启用它们......但它变得越来越复杂!
  • 我在您的代码中看到的一个问题是两个线程都调用了wait()。两个线程都使用 notify() 吗?否则,这会导致线程阻塞并等待永远不会出现的 notify()。编辑:我刚刚注意到您在上面的评论。您是否从同步块内部调用了 notify() ?调用notify时不握住显示器是不行的。
  • 这是一个没有意识到的错误,但我无法输入新代码...我从主线程调用 wait() 并从新线程调用 notify()...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-30
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
  • 2016-10-26
相关资源
最近更新 更多