代码示例转载自:https://blog.csdn.net/wthfeng/article/details/78762343
public class Practise{
static final Object obj = new Object();
private static boolean flag = false;
@Test
public void test() throws Exception{
Thread consume = new Thread(new Consume(), "Consume");
Thread produce = new Thread(new Produce(), "Produce");
consume.start();
Thread.sleep(1000);
produce.start();
try{
produce.join();
consume.join();
}catch (InterruptedException e){
e.printStackTrace();
}
}
//生产者线程
static class Produce implements Runnable{
@Override
public void run(){
synchronized (obj){
System.out.println("进入生产者线程");
System.out.println("生产");
try{
TimeUnit.MILLISECONDS.sleep(2000); //模拟生产过程
flag = true;
obj.notify();//通知消费者
TimeUnit.MILLISECONDS.sleep(2000); //模拟其他耗时操作
System.out.println("退出生产者线程");
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
}
//消费者线程
static class Consume implements Runnable{
@Override
public void run(){
synchronized (obj){
System.out.println("进入消费者线程");
System.out.println("wait flag 1:" + flag);
while (!flag){
try{
System.out.println("还没生产,进入等待");
obj.wait();
System.out.println("结束等待");
}catch (InterruptedException e){
e.printStackTrace();
}
}
System.out.println("wait flag 2:" + flag);
System.out.println("消费");
System.out.println("退出消费者线程");
}
}
}
}
控制台打印结果
进入消费者线程
wait flag 1:false
还没生产,进入等待
进入生产者线程
生产
退出生产者线程
结束等待
wait flag 2:true
消费
退出消费者线程
Process finished with exit code 0
当生产者执行notify方法后并没有执行消费者线程,而是退出线程后执行,这是由于synchronized同步代码块的作用,当生产者线程拿到对象锁后执行完同步代码块释放锁,消费者线程才能拿到对象锁。注意,执行wait方法会释放锁资源。