并发协作模型:生产者消费者模型 解决方式2.信号灯法

并发协作模型:生产者消费者模型 解决方式2.信号灯法

信号灯法

并发协作模型"生产者/消费者模式" ===> 信号灯法

通过建立标志位,根据标志位来判断是否通知,类似红灯停、绿灯行,什么时候只监听,什么时候允许通过来解决线程通过的方式。

代码

package testthread.gaoji;

/**
 * 并发协作模型"生产者/消费者模式"	  ===>	信号灯法
 * 通过建立标志位,根据标志位来判断是否通知,类似红灯停、绿灯行,什么时候只监听,什么时候允许通过来解决线程通过的方式
 * 有4个要素
 * 1.生产者
 * 2.消费者
 * 3.产品
 * 4.标志位
 */
public class TestPC2 {


    public static void main(String[] args) {
        Movie movie = new Movie("长津湖#误杀#你好,李焕英#误杀2#悬崖之上#我和我的家乡#八佰#侍神令#我和我的祖国#温暖的抱抱#长津湖之水门桥#疯狂的外星人#西虹市首富#速度与激情9");
        new Producer2(movie).start();
        new Consumer2(movie).start();
    }
}

//生产者
class Producer2 extends Thread {

    Movie movie;

    public Producer2(Movie movie) {
        this.movie = movie;
    }

    //生产
    @Override
    public void run() {
        String[] names = this.movie.getFilmName().split("#");
        for (int i = 0; i < names.length; i++) {
            this.movie.loading(names[i]);
        }
    }
}

//消费者
class Consumer2 extends Thread {

    Movie movie;

    public Consumer2(Movie movie) {
        this.movie = movie;
    }

    //消费
    @Override
    public void run() {
        String[] names = this.movie.getFilmName().split("#");
        for (int i = 0; i < names.length; i++) {
            this.movie.seeMovie();
        }
    }
}


// 产品
class Movie {
    private String filmName;
    boolean flag = true;

    public Movie(String filmName) {
        this.filmName = filmName;
    }

    //缓冲电影
    public synchronized void loading(String filmName) {

        if (!flag) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("电影《" + filmName + "》缓冲完成了,可以观看!");
        //通知观看
        this.notifyAll();//通知唤醒
        this.filmName = filmName;
        this.flag = !flag;
    }

    //看电影
    public synchronized void seeMovie() {

        if (flag) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("看电影...");
        //看电影
        this.notifyAll();//通知唤醒
        this.flag = !flag;

    }

    public String getFilmName() {
        return filmName;
    }

    public void setFilmName(String filmName) {
        this.filmName = filmName;
    }
}

输出

电影《长津湖》缓冲完成了,可以观看!
看电影...
电影《误杀》缓冲完成了,可以观看!
看电影...
电影《你好,李焕英》缓冲完成了,可以观看!
看电影...
电影《误杀2》缓冲完成了,可以观看!
看电影...
电影《悬崖之上》缓冲完成了,可以观看!
看电影...
电影《我和我的家乡》缓冲完成了,可以观看!
看电影...
电影《八佰》缓冲完成了,可以观看!
看电影...
电影《侍神令》缓冲完成了,可以观看!
看电影...
电影《我和我的祖国》缓冲完成了,可以观看!
看电影...
电影《温暖的抱抱》缓冲完成了,可以观看!
看电影...
电影《长津湖之水门桥》缓冲完成了,可以观看!
看电影...
电影《疯狂的外星人》缓冲完成了,可以观看!
看电影...
电影《西虹市首富》缓冲完成了,可以观看!
看电影...
电影《速度与激情9》缓冲完成了,可以观看!
看电影...
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值