本例是阅读Think in Java中相应章节后,自己实际写了一下自己的实现
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; /* 假设一个学生,日出而作日落而息 */ class Student { private boolean Awake=false; public synchronized void wakeUp() { Awake=true; System.out.println("WakeUp!"); notifyAll(); //notifyAll()写在这里!1.临界区 2.已经做了一些改变 } public synchronized void sleep() { Awake=false; System.out.println("Sleep!"); notifyAll(); //同上 } public synchronized void waitForSleep() throws InterruptedException { while(Awake!=false) wait(); //等待写在这里!1.临界区 2.等待外界改变的条件 } public synchronized void waitForAwake() throws InterruptedException{ while(Awake!=true) wait(); //同上 } public boolean isAwake() { return Awake; } } class SunRise implements Runnable {//日出 Student student=null; public SunRise(Student student) { this.student=student; } @Override public void run() { try { while (!Thread.interrupted()) { student.waitForSleep(); //先等待环境变化 TimeUnit.MILLISECONDS.sleep(100); student.wakeUp(); //环境已变化,起床! System.out.println("End Awake"); } }catch (InterruptedException e) { e.printStackTrace(); } } } class SunFall implements Runnable { Student student=null; public SunFall(Student student) { this.student=student; } @Override public void run() { try{ while (!Thread.interrupted()) { student.waitForAwake(); //先等待环境变化 TimeUnit.MILLISECONDS.sleep(100); student.sleep(); //环境已变化,睡觉! System.out.println("End Sleep"); } }catch (InterruptedException e) { e.printStackTrace(); } } } public class Main{ public static void main(String[]args) { Student me=new Student(); SunRise sunRise=new SunRise(me); SunFall sunFall=new SunFall(me); ExecutorService service= Executors.newCachedThreadPool(); service.execute(sunRise); service.execute(sunFall); } }
输出是
WakeUp! End Awake Sleep! End Sleep
的不停循环。
应该算成功了吧。