0
notify
呼び出しを待っているウェイタスレッドが既に待機している場合、別のウェイタスレッドが同期ブロックに入ることはできますか?Javaのスレッドとマルチスレッド
私は他の例でテストしているし、他のすべてのスレッドがスレッドのいずれかが同期ブロックであるときに同期ブロックに入るのを待つように見えるし、新しいスレッドが古いブロックを離れた直後に同期ブロックに入る:
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");
}
}