生产者消费者模式实现交替输出

生产者消费者模式实现交替输出

学完并发之后的小练习,使用生产者消费者模式实现交替输出数字,t1线程输出奇数,t2线程输出偶数,两个线程共享Num对象(临界区)。

代码如下:

package tread;

public class ThreadPractice {
    public static void main(String[] args) {
        Num num = new Num(1);

        Thread t1 = new Thread(new PrintOdd(num));
        Thread t2 = new Thread(new PrintEven(num));

        t1.setName("t1");
        t2.setName("t2");

        t1.start();
        t2.start();
    }
}

class PrintOdd implements Runnable {
    private Num num;

    public PrintOdd(Num num){
        this.num = num;
    }
    @Override
    public void run() {
        synchronized (num) {
            while (true){
                if (num.getI() % 2 == 0){
                    try {
                        num.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "--->" + num.getI());
                num.setI(num.getI() + 1);
                num.notify();
            }
        }
    }
}

class PrintEven implements Runnable {
    private Num num;
    public PrintEven(Num num) {
        this.num = num;
    }
    @Override
    public void run() {
        synchronized (num) {
            while (true) {
                if(num.getI() % 2 != 0) {
                    try {
                        num.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "--->" + num.getI());
                num.setI(num.getI() + 1);
                num.notify();
            }
        }
    }
}

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;
    }
}

为了交替输出的频率不会太快,输出之前使用sleep()方法间隔了一会儿。

输出结果:

生产者消费者模式实现交替输出_第1张图片

过程原理:

两个线程启动后,都有可能抢到CPU时间片,假设打印奇数的线程首先抢到时间片,此时如果数字对象的值为奇数,则打印奇数的线程(t1)在控制台中输出,之后数字值变为偶数,t1线程等待,释放锁,此时输出偶数的线程(t2)获得锁,在控制台中输出后数字值加一并唤醒在Num对象上等待的线程t1同时释放锁,如此循环通过使用wait()和notify()方法的配合来模仿生产者消费者模式,实现一个交替输出。

你可能感兴趣的:(多线程,java,thread)