死锁解决方式之一生产消费者模式之信号灯法

Posted yjxs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了死锁解决方式之一生产消费者模式之信号灯法相关的知识,希望对你有一定的参考价值。

package Tread;

/**
 * 生产者消费者模式:信号灯法 
 * wait():等待,释放锁;
 *  notify(); 
 *  wait和notify必须和sychronized一同使用;
 *  sleep():抱着锁睡觉:
 *
 */
public class Movie {
	private String pic;
	private boolean flag = true;

	// 信号灯
	// flag=T:生产生产,消费者等待,生产完成后通知消费:
	// flag=F:消费者消费,生产者等待,消费完成后通知生产;
	public Movie(String pic) {
		super();
		this.pic = pic;
	}

	public Movie() {

	}

	/**
	 * 播放功能
	 * 
	 * @throws InterruptedException
	 */
	public synchronized void play(String pic) {
		if (!flag) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		try {
			Thread.sleep(500);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		this.pic = pic;
		System.out.println("生产了" + pic);
		this.notify();
		this.flag = false;
	}

	/**
	 * 收看功能
	 */
	public synchronized void watch() {
		if (flag) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		try {
			Thread.sleep(200);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		this.notify();
		this.flag = true;
		System.out.println("消费了" + pic);
	}
}
package Tread;

public class Player implements Runnable {
	private Movie m;

	@Override
	public void run() {
		for (int i = 0; i < 20; i++) {
			if (0 == i % 2) {
				m.play("左青龙");
			} else {
				m.play("右白虎");
			}
		}

	}

	public Player(Movie movie) {
		super();
		this.m = movie;
	}

}
package Tread;

public class Watcher implements Runnable {
	private Movie m;

	@Override
	public void run() {
		for (int i = 0; i < 20; i++) {
			m.watch();

		}
	}

	public Watcher(Movie movie) {
		super();
		this.m = movie;
	}
}
package Tread;

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(p).start();
		new Thread(w).start();

	}
}

  其中Movie是公共资源;

以上是关于死锁解决方式之一生产消费者模式之信号灯法的主要内容,如果未能解决你的问题,请参考以下文章

多线程21:信号灯法

多线程等待唤醒机制之生产消费者模式

多线程等待唤醒机制之生产消费者模式

线程间的通信 与 线程池

Linux死锁 && 生产者与消费者模型 && 信号量

Linux死锁 && 生产者与消费者模型 && 信号量