生产者消费者模式(专为多线程并发设计的模式)

第一个类代码(模板)

package ProduceConsumers;

/**
 * 1 一个共同的场景,同一份资源
 * 
 * 2 生产者消费者模式  信号灯法
 *   wait()等待,会释放资源锁,而sleep()不会释放资源锁
 *   notify()或notifyAll()会唤醒线程
 * 
 * 3 此设计模式是跟synchronized一起使用的,这个模式的创建也是为了解决同步死锁的问题
 * 
 * 4 如果不添加本设计模式,直接运行两个方法虽然保证了生产和消费间歇操作,但是会出现null结果
 * @author Chyjrily
 *
 */
public class Movie {

	private String pic;
	
	//信号灯
	//flag --> true    生产者生产,消费者等待,生产完成后通知消费
	//flag --> false   消费者消费,生产者等待,消费完成后通知生产
	private boolean flag = true;
	
	//上演
	public synchronized void play(String pic) throws InterruptedException {
		if(!flag) {
			this.wait(); //生产者等待
		}
		
		Thread.sleep(5000000); //这里的模拟生产的时间为什么没用
		
		//生产完成
		this.pic = pic;
		
		//通知消费者
		this.notifyAll();
		
		//生产者停下
		this.flag = false;
		
	}
	
	//观看
	public synchronized void watch() throws InterruptedException {
		
		if(flag) {
			this.wait(); //消费者等待
		}
		
		//开始消费
		Thread.sleep(2000000); //同上
		
		//消费完成
		System.out.println(pic); 
		
		//通知生产
		this.notify();
		
		//消费停止
		this.flag = true;
		
		
	}
}

 

第二个类的代码(生产者)

package ProduceConsumers;

public class Player implements Runnable{

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

	public void run() {
		for(int i=0; i<50; i++) {
			if(0 == i%2) {
				System.out.println("评论支持了一下崔永元");
			}else {
				System.out.println("评论损了一下冯小刚");
			}
		}
	}
}

第三个类代码(消费者)

package ProduceConsumers;

/**
 * 消费者
 * @author Chyjrily
 *
 */
public class Watcher implements Runnable{

	private Movie m;
	
	public Watcher(Movie m) {
		super();
		this.m = m;
	}

	public void run() {
	
		for(int i=0; i<50; i++) {
			try {
				m.watch();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
}

第四个类(运行)

package ProduceConsumers;

public class MovieApp {

	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();  //如果不加入任何同步,运行的结果会出现null,不知为何且最后一段运行结果全是null
	
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多线程生产者消费者模式是一种常见的并发编程模式,用于解决生产者和消费者之间的数据交互问题。在Java中,可以使用多线程和相关的同步机制来实现生产者消费者模式。 在这种模式中,生产者负责生成数据,并将数据放入共享的缓冲区中,而消费者则从缓冲区中取出数据进行处理。为了保证线程安全和避免竞态条件,需要使用锁或其他同步机制来控制对共享缓冲区的访问。 以下是一个简单的Java多线程生产者消费者的示例代码: ```java import java.util.LinkedList; class ProducerConsumer { private LinkedList<Integer> buffer = new LinkedList<>(); private int capacity = 10; public void produce() throws InterruptedException { int value = 0; while (true) { synchronized (this) { while (buffer.size() == capacity) { wait(); } System.out.println("Producer produced: " + value); buffer.add(value++); notify(); Thread.sleep(1000); } } } public void consume() throws InterruptedException { while (true) { synchronized (this) { while (buffer.isEmpty()) { wait(); } int value = buffer.removeFirst(); System.out.println("Consumer consumed: " + value); notify(); Thread.sleep(1000); } } } } public class Main { public static void main(String[] args) { ProducerConsumer pc = new ProducerConsumer(); Thread producerThread = new Thread(() -> { try { pc.produce(); } catch (InterruptedException e) { e.printStackTrace(); } }); Thread consumerThread = new Thread(() -> { try { pc.consume(); } catch (InterruptedException e) { e.printStackTrace(); } }); producerThread.start(); consumerThread.start(); } } ``` 上述代码中,ProducerConsumer类维护了一个缓冲区buffer和一个容量capacity。生产者通过调用produce方法向缓冲区中添加数据,消费者通过调用consume方法从缓冲区中取出数据。在生产者和消费者的方法中,使用synchronized关键字来保证同一时间只有一个线程能够访问共享资源,并使用wait和notify方法来实现线程间的通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值