【发布时间】:2014-03-03 12:49:22
【问题描述】:
嗨,我试图理解等待通知,我在代码中看到了这种行为,即 2 个线程正在同一对象的同步块内打印语句。
public class WaitNotifyExample {
/**
* @param args
*/
public static void main(String[] args) {
Message msg = new Message("process it");
Waiter waiter = new Waiter(msg);
new Thread(waiter,"waiter").start();
Waiter waiter1 = new Waiter(msg);
new Thread(waiter1, "waiter1").start();
Notifier notifier = new Notifier(msg);
new Thread(notifier, "notifier").start();
//System.out.println("All the threads are started");
}
}
class Message {
private String msg;
public Message(String str){
this.msg=str;
}
public String getMsg() {
return msg;
}
public void setMsg(String str) {
this.msg=str;
}
}
class Waiter implements Runnable{
private Message msg;
public Waiter(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());
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());
}
}
}
class Notifier implements Runnable {
private Message msg;
public Notifier(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();
}
}
}
这是程序的输出:
- 等待时间通知的服务员:1393849891481 -通知程序已启动 -waiter1 等待收到通知的时间:1393849891483 -waiter1 服务员线程在时间得到通知:1393849892483 -waiter1 已处理:通知程序通知程序工作已完成 -waiter 服务员线程在时间得到通知:1393849892483 服务员处理:通知程序通知程序工作完成【问题讨论】:
标签: java multithreading wait synchronized