【问题标题】:How to wait for the thread and handler to get initialised如何等待线程和处理程序初始化
【发布时间】:2011-12-05 08:02:34
【问题描述】:

我正在编写一个应用程序。我遇到了这样一种情况,我必须创建两个线程,首先创建线程 1,然后创建线程 2。 thread1 必须发布到 thread2 的处理程序。但是由于系统速度很快,在创建线程 2 和初始化处理程序之前,线程 1 开始将消息对象发布到线程 2。因此,我面临着意想不到的行为。

请告诉我如何在线程 1 中等待线程 2 启动并初始化处理程序。我尝试了轮询机制,因为它会影响系统性能,此修复不被接受。

【问题讨论】:

    标签: java android multithreading android-2.2-froyo


    【解决方案1】:

    只需使用类似的东西:

    // @ Thread 1
    synchronized( someMonitor ) {
      someMonitor.wait( /* time? */ );
    }
    
    // @ Thread 2
    synchronized( someMonitor ) {
      someMonitor.notify();
    }
    

    所以线程 1 将等待线程 2 通知。如果条件已经设置,我会在等待之前检查。

    【讨论】:

    • 线程 1 不能保证在线程 2 之前启动,因此在这种情况下您可能会无限等待。更好的是在没有这种依赖的情况下尽可能地解耦它们(这对于多个生产者或多个消费者来说并不能很好地扩展。
    • 你读过我的最后一行吗?他应该在等待之前检查条件是否已经设置。
    • 抱歉,重点是没有等待条件的代码。
    • 这可能工作正常,但我的情况是这样的stackoverflow.com/questions/4838207/… 不完全一样,使用本节中的代码来解决相同的问题。
    【解决方案2】:

    另一种方法是从线程 1 创建线程 2,以便在线程 1 开始发布内容之前创建线程 2 用于输入的队列或其他任何内容。

    Rgds, 马丁

    【讨论】:

      【解决方案3】:
      【解决方案4】:

      您需要重新考虑您的设计:看起来您正在处理生产者/消费者模型,因此您可能希望使用(阻塞)队列进行消息交换。从两个线程中创建它,并在创建时将其传递给生产者和消费者。在这种情况下,哪个线程先开始运行并不重要:如果生产者则队列开始被填满,如果是消费者,那么它将等到生产者也开始运行。

      【讨论】:

      • 实际上我正在线程中创建队列,所以在线程进入运行状态之前(正在创建新的 Handler()),它创建的线程开始在下一行发布thread.start() 的。因此,我面临崩溃。所以,这不是生产者和消费者的问题。如果我的描述不正确,我深表歉意。
      【解决方案5】:

      您的第一个选择是使消息队列全局化。

      第二种是从thread1创建thread2。

      三是要有同步对象(Object.wait,notify,interrupt)。

      不过,我认为和 Mark 一样,问题出在你的设计中,如果固有设计不合适,你就无法为这个问题找到一个好的解决方案。

      【讨论】:

        猜你喜欢
        • 2018-12-15
        • 1970-01-01
        • 2017-04-29
        • 2012-07-13
        • 1970-01-01
        • 2013-04-09
        • 2015-07-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多