java多线程模拟小明看书烧水再喝茶的例子

/*想模拟的场景:

        小明作为一个线程执行的对象,他可以看书,等另一个烧水线程的水烧开后,通知小明停止看书去喝茶。
        我自己摸索的代码如下:

        还有以下疑问:

        烧水的线程把水烧开后,它能否直接让小明这个线程停止看书,转而去喝茶。不是用我例子中的这种停止方式。
        就是说a线程能否主动让b线程终止b正在执行的代码,转而让b去执行另一些代码?

        */
public class Xiaoming {
    public boolean isWaterOK = false;
    public int pageNum = 1;
    public Object obj;

    public Xiaoming(Object obj) {
        this.obj = obj;
    }

    public synchronized void setWaterOK(boolean waterOK) {
        isWaterOK = waterOK;
    }


    public void boilTheWater(Kettle kettle) {
        kettle.beBoiled();
    }

    public void readBook(int i) {
        System.out.println(Thread.currentThread().getName() + "  小明:看书" + i);
    }

    public void drinkTea() {
        System.out.println(Thread.currentThread().getName() + "  小明:喝茶...");
    }

    public static void main(String[] args) {
        Object obj = new Object();
        Xiaoming xiaoming = new Xiaoming(obj);
        Kettle kettle = new Kettle(xiaoming, obj);
        MyThread1 myThread1 = new MyThread1(xiaoming, kettle);
        myThread1.setName("线程-1");
        myThread1.start();
        MyThread2 myThread2 = new MyThread2(xiaoming, kettle);
        myThread2.setName("线程-2");
        myThread2.start();
    }
}

class MyThread1 extends Thread {
    Xiaoming mXiaoming;
    Kettle kettle;

    public MyThread1(Xiaoming xiaoming, Kettle kettle) {
        mXiaoming = xiaoming;
        this.kettle = kettle;
    }

    public void run() {

        while (true) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (mXiaoming.obj) {
                if (kettle.temperature < 100) {
                    mXiaoming.boilTheWater(kettle);
                } else {
                    return;
                }
            }
        }
    }
}

class MyThread2 extends Thread {
    Xiaoming mXiaoming;
    Kettle kettle;


    public MyThread2(Xiaoming xiaoming, Kettle kettle) {
        mXiaoming = xiaoming;
        this.kettle = kettle;
    }

    public void run() {

        while (true) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (mXiaoming.obj) {
                if (!mXiaoming.isWaterOK) {

                    mXiaoming.readBook(mXiaoming.pageNum);
                    mXiaoming.pageNum++;
                } else {
                    break;
                }
            }
        }
        mXiaoming.drinkTea();
    }
}

class Kettle {
    Xiaoming mXiaoming;
    public int temperature = 0;
    Object obj;

    public Kettle(Xiaoming xiaoming, Object obj) {
        mXiaoming = xiaoming;
        this.obj = obj;
    }

    public void beBoiled() {
        if (temperature < 100) {
            temperature++;
        } else {
            return;
        }
        System.out.println(Thread.currentThread().getName() + "  茶壶:烧水 水温:" + temperature);
        if (temperature == 100) {
            mXiaoming.setWaterOK(true);
        }
    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值