线程通信_交替打印案例

线程通信_交替打印案例


/**
 * wait()、notify()、notifyAll()是三个定义在Object类里的方法,可以用来控制线程的状态。
 * 这三个方法最终调用的都是jvm级的native方法。随着jvm运行平台的不同可能有些许差异。
 *
 * todo 如果对象调用了wait方法就会使持有该对象的线程把对象的控制权交出去,然后处于等待状态
 * todo 如果对象调用了notify方法就会通知某个正在等待这个对象的控制权的线程可以继续运行
 * todo 如果对象调用了notifyAll方法就会通知所有等待这个对象控制权的线程继续运行
 *
 * todo 注意 wait() 方法的调用必须放在synchronized方法或synchronized快中
 */

/**
 *  wait与sleep区别
 *
 *  todo 对于sleep() 方法,我们首先要知道方法是属于Thread类中的,而wait() 方法,则属于object类中的。
 *  todo sleep() 方法导致了程序暂停执行指定的时间,让出cpu给其他线程,但是它的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态
 *  todo 在调用sleep() 方法的过程中,线程不会释放对象锁而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定时,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态
 */
public class D1_线程通信_交替打印案例 {
    public static void main(String[] args) {
        NumberMode numberMode = new NumberMode();
        new Thread(new PrintjiNum(numberMode)).start();
        new Thread(new PrintOuNum(numberMode)).start();

    }

    static class NumberMode {
        public int mum = 1;
    }

    static class PrintjiNum implements Runnable {

        NumberMode numberMode;

        public PrintjiNum(NumberMode numberMode) {
            this.numberMode = numberMode;
        }

        @Override
        public void run() {
            while (numberMode.mum < 100) {
                synchronized (numberMode) {
                    if (numberMode.mum % 2 != 0) {
                        System.out.println("奇数" + numberMode.mum);
                        numberMode.mum++;
                        numberMode.notify();
                    } else {
                        try {
                            System.out.println("奇数线程休息");
                            numberMode.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }

    static class PrintOuNum implements Runnable {

        NumberMode numberMode;

        public PrintOuNum(NumberMode numberMode) {
            this.numberMode = numberMode;
        }

        @Override
        public void run() {
            while (numberMode.mum < 100) {
                synchronized (numberMode) {
                    if (numberMode.mum % 2 == 0) {
                        System.out.println("偶数:" + numberMode.mum);
                        numberMode.mum++;
                        numberMode.notify();
                    } else {
                        try {
                            numberMode.wait();
                            System.out.println("偶数线程休息");
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值