And*_*lov 6 java multithreading synchronization
我不确定在使用辅助线程执行某些代码之后,主线程中的某些代码将被执行.这是我得到的:
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");
Run Code Online (Sandbox Code Playgroud)
Syn*_*r0r 12
事情是这样通知()和等待()是非常低级别的同步原语.
您应尽可能使用更高级别的抽象,例如,在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");
Run Code Online (Sandbox Code Playgroud)
等待和通知等低级事物实际上只是您不应该关注的低级Java特性(除非您正在编写并发API).
另外,我建议阅读这本神奇的书:Java Concurrency In Practice.
假设您的主线程需要启动辅助线程的处理,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);
}
Run Code Online (Sandbox Code Playgroud)