【发布时间】:2016-03-18 21:58:48
【问题描述】:
如果一个等待线程已经在等待notify 调用的块中等待,另一个等待线程如何进入同步块?
我已经用其他示例进行了测试,当其中一个线程处于同步块中并且新线程在旧线程离开块后立即进入同步块时,所有其他线程似乎都在等待进入同步块:
class ThreadClassNotifier implements Runnable {
private Message msg;
public ThreadClassNotifier(Message msg) {
this.msg = msg;
}
@Override
public void run() {
String name = Thread.currentThread().getName();
System.out.println(name+" started");
try {
Thread.sleep(1000);
synchronized (msg) {
msg.setMsg(name+" Notifier work done");
msg.notify();
// msg.notifyAll();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class ThreadClassWaiter implements Runnable {
private Message msg;
public ThreadClassWaiter(Message m){
this.msg=m;
}
@Override
public void run() {
String name = Thread.currentThread().getName();
synchronized (msg) {
try{
System.out.println(name+" waiting to get notified at time:"+System.currentTimeMillis());
Thread.sleep(10000);
msg.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(name+" waiter thread got notified at time:"+System.currentTimeMillis());
//process the message now
System.out.println(name+" processed: "+msg.getMsg());
}
}
}
public class ThreadMain {
public static void main(String[] args) throws InterruptedException {
Message msg = new Message("process it");
ThreadClassWaiter waiter = new ThreadClassWaiter(msg);
new Thread(waiter,"waiter").start();
ThreadClassWaiter waiter1 = new ThreadClassWaiter(msg);
new Thread(waiter1, "waiter1").start();
System.out.println("All the threads are started");
}
}
【问题讨论】:
标签: java multithreading