我不确定在使用辅助线程执行某些代码之后,主线程中的某些代码将被执行。这就是我得到的:
final Object lock = new Object();
final Thread t = new Thread(new Runnable() {
public void run() {
synchronized(lock) {
System.out.println("qwerty");
lock.notify();
}
}
});
synchronized(lock) {
t.start();
lock.wait();
}
System.out.println("absolutely sure, qwerty is above");
答案 0 :(得分:12)
notify()和 wait()之类的东西实际上是低级同步原语。
您应尽可能使用更高级别的抽象,例如, CountDownLatch 。
以下只是一个可以帮助您入门的示例(例如,此处未考虑超时问题):
final CountDownLatch latch = new CountDownLatch(1);
final Thread t = new Thread(new Runnable() {
public void run() {
System.out.println("qwerty");
latch.countDown();
}
});
t.start();
latch.await();
System.out.println("absolutely sure, qwerty as been printed");
等待和 notify 之类的低级内容实际上只是您不应该关注的低级Java特性(除非您正在编写并发API)
此外,我建议阅读这本神奇的书: Java Concurrency In Practice 。
答案 1 :(得分:5)
假设您的主线程需要启动辅助线程的处理,Exchanger将是最简单的解决方案。
如果辅助线程是独立的,那么某种形式的BlockingQueue是合适的。
使用Exchanger的示例(具有适当的异常处理)。一个交换器可以用两个队列代替。
public static void main(String[] argv)
throws Exception
{
final Exchanger<String> exchanger = new Exchanger<String>();
new Thread(new Runnable()
{
@Override
public void run()
{
try
{
String s = exchanger.exchange("");
System.out.println(s);
exchanger.exchange("this came from subthread");
}
catch (InterruptedException ex)
{
System.out.println("interrupted while waiting for message");
}
}
}).start();
exchanger.exchange("this came from main thread");
String s = exchanger.exchange("");
System.out.println(s);
}
答案 2 :(得分:-1)
final Thread t = new Thread(new Runnable() {
public void run() {
System.out.println("qwerty");
}
});
t.start();
t.join();
System.out.println("absolutely sure, qwerty is above");
答案 3 :(得分:-4)
您提供的代码的最佳解决方案是:
System.out.println("qwerty");
System.out.println("absolutely sure, qwerty is above");
不需要时请勿使用线程。
但是如果你知道你在线程中做了什么,那么@ DoubleMalt的解决方案是可行的方法(t.join()
)。
你也可能觉得值得一读http://download.oracle.com/javase/tutorial/essential/concurrency/