Java 如何等待线程和处理程序初始化

Java 如何等待线程和处理程序初始化,java,android,multithreading,android-2.2-froyo,Java,Android,Multithreading,Android 2.2 Froyo,我正在写申请书。我遇到这样一个场景,我必须创建两个线程,首先创建thread1,然后创建thread2。thread1必须投递到thread2的处理程序中。但由于系统速度很快,在创建thread2和初始化处理程序之前,thread1就开始将消息对象发布到thread2。因此,我面临着意想不到的行为 请告诉我如何在thread1中等待thread2启动并初始化处理程序。我尝试了轮询机制,因为它会影响系统性能。此修复程序不被接受。请使用类似的方法: // @ Thread 1 synchronize

我正在写申请书。我遇到这样一个场景,我必须创建两个线程,首先创建thread1,然后创建thread2。thread1必须投递到thread2的处理程序中。但由于系统速度很快,在创建thread2和初始化处理程序之前,thread1就开始将消息对象发布到thread2。因此,我面临着意想不到的行为


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

请使用类似的方法:

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

// @ Thread 2
synchronized( someMonitor ) {
  someMonitor.notify();
}

因此线程1将等待线程2通知。我会在等待之前检查条件是否已经设置。

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

Rgds,
Martin

我建议查看JDK中的CountDownLatch类


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

您的第一个选择是将消息队列设为全局

第二个是从thread1创建thread2

第三个是有一个同步对象(object.wait、notify、interrupt)


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

线程1不能保证在线程2之前启动,因此在这种情况下,您可能会有无限的等待。最好是在没有这种依赖的情况下尽可能地将它们解耦(对于多个生产商或多个消费者来说,这并不能很好地扩展。你读过我的最后一行了吗?他应该在等待之前检查条件是否已经设置。对不起,重点是没有等待条件的代码。这可能行得通,但我的情况与此不完全相同,使用了t部分中的代码o解决相同的问题。实际上,我正在线程中创建队列,因此在线程进入运行状态(正在创建新的处理程序()之前),它创建的线程开始在thread.start()的下一行中发布。因此,我面临崩溃。所以,这不是生产者和消费者的问题。如果我的描述不正确,我道歉。