java线程 生产者与消费者

package org.rui.thread.block;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * 生产者与消费者
 * 餐馆
 *
 * @author lenovo
 *
 */
public class Restaurant {

	//Restaurant r=new Restaurant();

	Meal meal;
	ExecutorService exec = Executors.newCachedThreadPool();
	WaitPerson waitP = new WaitPerson(this);
	Chef chef = new Chef(this);

	public Restaurant() {
		exec.execute(chef);
		exec.execute(waitP);
	}

	public static void main(String[] args) {
		new Restaurant();
	}

}

// 餐
class Meal {
	private final int orderNum;

	public Meal(int orderNum) {
		this.orderNum = orderNum;
	}

	public String toString() {
		return "Meal " + orderNum;
	}

}

// 服务员
class WaitPerson implements Runnable {
	private Restaurant restaurant;

	public WaitPerson(Restaurant r) {
		restaurant = r;
	}

	public void run() {

		try {
			while (!Thread.interrupted()) {

				synchronized (this) {
					while (restaurant.meal == null)//如果餐为空,服务员等待
						wait();
				}
				System.out.println("waitperson got " + restaurant.meal);
				//在厨师上同步  上完餐 并通知厨师
				synchronized (restaurant.chef) {
					restaurant.meal = null;
					restaurant.chef.notifyAll();// 准备另一个
				}
			}
		} catch (InterruptedException e) {
			System.out.println("WaitPerson interrupted");
		}
	}
}

//厨师
class Chef implements Runnable {

	Restaurant restaurant;
	private int count = 0;

	public Chef(Restaurant r) {
		restaurant = r;
	}

	@Override
	public void run() {
		try {
			while (!Thread.interrupted()) {
				/**
				 * 厨师送上餐,并通知服务员,就等待 ,直至服务员收集到订单并通知厨师
				 */
				synchronized (this) {
					while (restaurant.meal != null)//就等待   while 防止错失信号的程序设计(如果if 可能会有其他线程插足拿走订单)
						wait();
				}
				if (++count == 10) {
					System.out.println("out of food, closing");
					restaurant.exec.shutdownNow();
				}
				System.out.print("order up!");
				//在服务员锁上同步
				synchronized (restaurant.waitP) {
					restaurant.meal = new Meal(count);//送上餐
					restaurant.waitP.notifyAll();//通知服务员
				}
				TimeUnit.MILLISECONDS.sleep(100);
			}

		} catch (InterruptedException e) {
			System.out.println("Chef interrupted");
		}

	}

}
/**
output:
order up!waitperson got Meal 1
order up!waitperson got Meal 2
order up!waitperson got Meal 3
order up!waitperson got Meal 4
order up!waitperson got Meal 5
order up!waitperson got Meal 6
order up!waitperson got Meal 7
order up!waitperson got Meal 8
order up!waitperson got Meal 9
out of food, closing
WaitPerson interrupted
order up!Chef interrupted

*/

时间: 2024-12-09 12:56:05

java线程 生产者与消费者的相关文章

Java多线程--生产者与消费者问题

说明 Java中,线程之间的通信主要是由java.lang.Object类提供的wait.notify和notifyAll这3个方法来完成: ①对象的wait方法被调用后,线程进入对象的等待队列中,并释放对象锁,其它线程可以竞争使用此对象锁:sleep方法使得一个线程进入睡眠状态,但是线程所占有的资源并没有释放. ②当对象的notify方法被调用,该方法会从对象的等待队列中随机取出一个线程来唤醒:notifyAll是唤醒等待队列中所有线程,这些线程会与其它正在执行的线程共同竞争对象锁. ③wai

java之生产者与消费者

package com.produce; import java.util.LinkedList; import java.util.Queue; /*@author shijin * 生产者与消费者模型中,要保证以下几点: * 1 同一时间内只能有一个生产者生产 生产方法加锁sychronized * 2 同一时间内只能有一个消费者消费 消费方法加锁sychronized * 3 生产者生产的同时消费者不能消费 生产方法加锁sychronized * 4 消费者消费的同时生产者不能生产 消费方

Java实现生产者和消费者

生产者和消费者问题是操作系统的经典问题,在实际工作中也常会用到,主要的难点在于协调生产者和消费者,因为生产者的个数和消费者的个数不确定,而生产者的生成速度与消费者的消费速度也不一样,同时还要实现生产者与消费者的解耦,即生产者并不知道有哪些消费者,而消费者也不需要知道产品是哪个生产的,他们之间只与一个交易平台发生关系. 这是现实世界普遍存在的问题,比如我们去苹果专卖店买IPhone 6,我们属于消费者,而生产商把产品生产出来放在苹果专卖店,如果全世界只有一个苹果专卖店,当专卖店没有IPhone 6

线程生产者与消费者

package cn.itcast.thread;/* 线程通讯:  一个A线程完成了当前的任务时,要通知另外B线程去做另外事情. 生产者与消费者. 问题一:价格错乱问题.(线程安全问题) 问题: 目前要不就是生成一大批的产品,要不消费一大批的产品 要求的效果: 生产一个消费一个. 线程通讯相关方法:     wait()       如果一个线程调用了wait方法,那么该线程会进入以锁对象的监听器作为标识符建立的线程池中等待.  等待状态先的线程会释放锁对象.     notify()    

java之生产者和消费者问题

package testThread; public class Test3 { public static void main(String[] args) { Clerk c = new Clerk(); //消费时不生产,生产时不消费 //生产者 new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub synchronized (c) { //无限生产 whil

java 线程 生产者-消费者与队列,任务间使用管道进行输入、输出 讲解示例 --thinking java4

package org.rui.thread.block2; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedB

JAVA线程-生产者消费者模式

package cn.tt; public class ProducerConsumer { public static void main(String[] args) throws InterruptedException { SyncStack ss = new SyncStack(); Producer p = new Producer(ss); consumer c = new consumer(ss); new Thread(p).start(); Thread.sleep(2000

RabbitMQ简单Java示例——生产者和消费者

添加Maven依赖: 使用rabbitmq-client的最新Maven坐标: <!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client --> <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>5.3.0</ver

java多线程:生产者和消费者模式(wait-notify) : 单生产和单消费

单生产者 package com.example.t.pc; import java.util.List; //生产者 public class P { private List list; public P(){ } public P(List list){ this.list = list; } public void add(){ while(true){ synchronized (list){ try { System.out.println("3s----------------&q