java 线程_181_生产者与消费者模式_信号灯法_练习

package 线程_181_生产者与消费者模式_信号灯法_练习;
/**

  • 解决线程死锁的方法
  • 创建一个场景 (共同的资源)
  • 生产者消费者模式:信号灯法
  • wait(): 等待及释放锁
  • sleep():不释放锁
  • 唤醒:notify(),一个线程使用
  •  notifyAll(),多个线程使用
    
  • 注意: Player方法和Watcher方法必须与Movie方法同步,否则无法等待
  •  notify(),notifyAll()与synchronized一起使用
    

*/
public class Movie {//Movie电影
//属性
private String pic;//pic影片
//加入标识(信号灯);flag–>为true表示生产者生产,消费者等待;生产完成后通知消费者
//相反flag–>为false时消费者生产,生产者等待;消费完成后通知生产者
private boolean flag = true;//flag标识;设置默认为true
//播放
public synchronized void play(String pic){//play播放,扮演;加入锁定synchronized
if(!flag){//生产者等待
try {
this.wait();//
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//开始生产
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
//输出
System.out.println(“生产了:”+pic);
//生产完毕
this.pic = pic;
//通知消费者
this.notify();
//生产者停止
this.flag = false;
}
//获取
public synchronized void watch(){//watch观看;加入锁定synchronized
if(flag){//消费者等待
try {
this.wait();//
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//开始消费
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
//消费完毕
System.out.println(“消费了:”+pic);
System.out.println("-------------------");
//通知生产者
this.notifyAll();//因为这里只有一个线程也可以使用notify():一个线程用notify();多个线程使用notifyAll()
//消费者停止
this.flag = true;
}

}
//--------------------------------------------------------
package 线程_181_生产者与消费者模式_信号灯法_练习;
/**

  • 创建线程:1.生产者

*/
public class Player implements Runnable {//Player表演者;Runnable可运行的
private Movie m ;//共同资源Movie

public Player(Movie m) {
	super();
	this.m = m;
}
@Override
public void run() {
	for(int i=0;i<10;i++){
		m.watch();
	}
}

}
//-------------------------------------------------
package 线程_181_生产者与消费者模式_信号灯法_练习;
/**

  • 创建线程:2.消费者
    */
    public class Watcher implements Runnable {//Watcher观察者(消费者)
    private Movie m ;//共同资源Movie

    public Watcher(Movie m) {
    super();
    this.m = m;
    }
    @Override
    public void run() {
    //
    for(int i=0;i<10;i++){
    if(0==i%2){//分配线程出现次数
    m.play(“大家都在学”);
    }else{
    m.play(“java”);
    }
    }
    }
    }
    //-----------------------------------------------
    package 线程_181_生产者与消费者模式_信号灯法_练习;
    /**

  • 应用
    */
    public class App {

    public static void main(String[] args) {
    //共同的资源
    Movie m = new Movie();
    //创建多线程对同一资源的访问
    Player p = new Player(m);
    Watcher w = new Watcher(m);
    //代理
    new Thread§.start();
    new Thread(w).start();
    }
    }
    //结果---------------------------------------
    生产了:大家都在学
    消费了:大家都在学


生产了:java
消费了:java

生产了:大家都在学
消费了:大家都在学

生产了:java
消费了:java

生产了:大家都在学
消费了:大家都在学

生产了:java
消费了:java

生产了:大家都在学
消费了:大家都在学

生产了:java
消费了:java

生产了:大家都在学
消费了:大家都在学

生产了:java
消费了:java

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值