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

使用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()方法练习)