美文网首页
初学Java,多线程之wait()和notify()方法练习

初学Java,多线程之wait()和notify()方法练习

作者: 石头时代zy | 来源:发表于2020-04-20 07:08 被阅读0次

    使用wait()和notify()方法实现以下需求:
    使用生产者和消费者模式实现,交替输出:
    假设只有两个线程,输出以下结果:
    奇数---->1
    偶数---->2
    奇数---->3
    偶数---->4
    奇数---->5
    偶数---->6
    奇数---->7
    偶数---->8
    ……
    要求:必须交替,并且t1线程负责输出奇数,t2线程负责输出偶数。

    public class Test {
        //主线程
        public static void main(String[] args) {
            //先把Num new出来,从1开始数
            Num num = new Num(1);
            //创建两个线程,一个负责数奇数、一个负责数偶数
            Thread t1 = new Thread(new odd(num));
            Thread t2 = new Thread(new even(num));
            //对两个线程进行命名
            t1.setName("奇数");
            t2.setName("偶数");
            //开始数数
            t1.start();
            t2.start();
        }
    }
    /**Num类,作为两个线程共享对象*/
    class Num{
        private int i;
        public Num(int i) {
            this.i = i;
        }
    
        public int getI() {
            return i;
        }
    
        public void setI(int i) {
            this.i = i;
        }
    }
    /**奇数线程*/
    class odd implements Runnable{
        //声明共有对象Num
        Num num;
        @Override
        public void run() {
            //死循环,让它一直数数
            while (true){
                //线程安全的,锁num,加判断是否为奇数
                synchronized (num){
                    if((num.getI())%2==0){
                        try {
                        //暂停且解锁
                            num.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                       } 
                    }
                    System.out.println(Thread.currentThread().getName() +"---->"+ num.getI());
                    try {
                    //由于电脑速度较快,在这里设置睡眠时间1秒容易看前面的变化。
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                }
                //对num的i进行+1处理
                num.setI(num.getI()+1);
                //唤醒
                num.notify();
                }
            }
    
        }
        public odd(Num num) {
            this.num = num;
        }
    }
    /**偶数线程*/
    class even implements Runnable{
        Num num;
        @Override
        public void run() {
            while (true) {
                synchronized (num) {
                    if ((num.getI()) % 2 == 1) {
                        try {
                            num.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println(Thread.currentThread().getName() + "---->" + num.getI());
                    num.setI(num.getI()+1);
                    num.notify();
                }
            }
        }
        public even(Num num) {
            this.num = num;
        }
    }
    

    相关文章

      网友评论

          本文标题:初学Java,多线程之wait()和notify()方法练习

          本文链接:https://www.haomeiwen.com/subject/ynyvvhtx.html