//第一种同步互斥模型:生产者-消费者实现方式-管程法
package _04;
public class _4_08Cooperation {
public static void main(String[] args) {
SynContainer container = new SynContainer();
new Productor(container).start();
new Consumer(container).start();
}
}
//生产者
class Productor extends Thread{
SynContainer container;
public Productor(SynContainer container){
this.container = container;
}
public void run(){
for(int i=0;i<100;i++){
System.out.println("生产---->"+i+"馒头");
container.push(new Steamedbun(i));
}
}
}
//消费者
class Consumer extends Thread{
SynContainer container;
public Consumer(SynContainer synContainer){
this.container = synContainer;
}
public void run(){
for(int i=0;i<1000;i++){
System.out.println("消费---->"+container.pop().id+"馒头");
}
}
}
//缓冲区
class SynContainer{
Steamedbun[] buns = new Steamedbun[10]; //存储数据的容器
int count = 0 ; //计数器
//存储
public synchronized void push(Steamedbun bun){
//何时能够生产 容器存在空间
if(count == buns.length){
try {
this.wait(); //线程阻塞
} catch (InterruptedException e) {
e.printStackTrace();
}
}
buns[count] = bun;
count++;
//存在数据啦 通知消费者
this.notifyAll();
}
//获取
public synchronized Steamedbun pop(){
if(count == 0){
try {
this.wait(); //此时线程阻塞 生产者通知
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count --;
Steamedbun bun = buns[count];
this.notifyAll(); //存在空间啦 唤醒生产者
return bun;
}
}
//馒头
class Steamedbun{
int id;
public Steamedbun(int id) {
this.id = id;
}
}
package _04;
//第二种协作模式: 生产者和消费者的实现方式: 信号灯法
//借助标志位
public class _4_09SynTest02 {
public static void main(String[] args) {
TV tv = new TV();
new Player(tv).start();
new Watcher(tv).start();
}
}
//生产者
class Player extends Thread{
TV tv ;
public Player(TV tv){
this.tv =tv;
}
public void run(){
for(int i=0;i<50;i++){
if(i%2==0){
tv.play("cola");
}else {
tv.play("baishi");
}
}
}
}
class Watcher extends Thread{
TV tv ;
public Watcher(TV tv){
this.tv =tv;
}
public void run(){
for(int i=0;i<50;i++){
tv.watch();
}
}
}
//同一资源
class TV{
String voice;
boolean flag = true;
//表演
public synchronized void play(String voice){
if(!flag){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("表演了:"+voice);
this.voice = voice;
this.notifyAll();
this.flag = !this.flag;
}
//观看
public synchronized void watch(){
if(flag){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("听到了:"+voice);
this.notifyAll();
this.flag = !this.flag;
}
}