一、背景
请模拟下面情形:
小孩在睡觉,醒来后要求吃东西
代码:
class Child{ private boolean wakenUp = false; void wakeUp(){ wakenUp = true; } public boolean isWakenUp() { return wakenUp; } public void setWakenUp(boolean wakenUp) { this.wakenUp = wakenUp; } } class Dad implements Runnable{ Child c; public Dad(Child c){ this.c = c; } @Override public void run() { while(!c.isWakenUp()){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } feed(c); } private void feed(Child c) { System.out.println("feed child"); } } public class Test { public static void main(String[] args) { Child d = new Child(); new Thread(new Dad(d)).start(); } }
上面代码运行起来是有问题的,永远等在那里,因为child永远不会醒过来;
那么,想让小孩5s之后醒过来怎么做?
二、让小孩5s之后醒
每一个小孩就是一个单独的线程;
代码:
class Child implements Runnable{ private boolean wakenUp = false; void wakeUp(){ wakenUp = true; } public boolean isWakenUp() { return wakenUp; } public void setWakenUp(boolean wakenUp) { this.wakenUp = wakenUp; } @Override public void run() { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } this.wakeUp(); } } class Dad implements Runnable{ Child c; public Dad(Child c){ this.c = c; } @Override public void run() { while(!c.isWakenUp()){ System.out.println("child is't wake up"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } feed(c); } private void feed(Child c) { System.out.println("feed child"); } } public class Test { public static void main(String[] args) { Child d = new Child(); new Thread(d).start(); new Thread(new Dad(d)).start(); } }
console:
child is't wake up child is't wake up child is't wake up child is't wake up child is't wake up feed child
这个小程序就模拟完了;也就是说要做完这个功能就已经做完了;
但是有什么不合理的地方?
小孩一直在睡着,如果采取现在这种编程模式,Dad就一直监视,无法干其他事情了,就只能在这里死死的盯着他;1s钟盯一眼,太累了;
这个累的意思就是,CPU的资源无端的被消耗了,CPU没事老是在这循环着;如果小孩3小时不醒就得循环3小时;这种编程的方式起码在效率上有问题;
那么,怎么修正这个问题呢?
三、