信号灯法
并发协作模型"生产者/消费者模式" ===> 信号灯法
通过建立标志位,根据标志位来判断是否通知,类似红灯停、绿灯行,什么时候只监听,什么时候允许通过来解决线程通过的方式。
代码
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》缓冲完成了,可以观看!
看电影...