java设计模式-工厂系列Observe

一、背景

请模拟下面情形:
小孩在睡觉,醒来后要求吃东西
 
代码:
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小时;这种编程的方式起码在效率上有问题;
 
那么,怎么修正这个问题呢?
 
三、
 

猜你喜欢

转载自www.cnblogs.com/tenWood/p/9206107.html
今日推荐