首页 > 编程语言 >Java多线程____生产者与消费者模型

Java多线程____生产者与消费者模型

时间:2023-09-13 12:37:20浏览次数:29  
标签:Java int Storage void storage ____ num 多线程 public


1.仓库类__:入库和出库的集合   有生产和出货方法

package com.test.thread;

import java.util.LinkedList;
/**
 * @author Administrator
 * 仓库类
 */
public class Storage {
	//存储集合
	private  LinkedList<Object> list = new LinkedList<Object>();
	
	public void ruku(int num) {
		synchronized (list) {
			while (list.size() + num > 100) {
				try {
					list.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			for (int i = 1; i <= num; ++i) {
				list.add(new Object());
			}
			System.out.println("生产完成量为:" + num + "现仓库有数量为:" + list.size());
			list.notifyAll();
		}
	}
	
	public void chuku(int num) {
		synchronized (list) {
			while (list.size() < num) {
				try {
					list.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			for (int i = 1; i <= num; ++i) {
				list.remove();
			}
			System.out.println("取货量为:" + num + "仓库剩余量为:" + list.size());
			list.notifyAll();
		}
	}

}

2.生产者

package com.test.thread;
/**
 * @author Administrator
 * 生产类
 */
public class Producer extends Thread {

	//每次生产的数量默认为仓库最大容量
	private int num=100;
	//建立仓库
	private Storage storage;
	
	// get/set方法
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public Storage getStorage() {
		return storage;
	}
	public void setStorage(Storage storage) {
		this.storage = storage;
	}

//构造函数,设置仓库
	public Producer(Storage storage) {
		this.storage = storage;
	}
//线程run方法执行生产方法
	public void produce(int num) {
		storage.ruku(num);
	}
	
	@Override
    public void run() {
    	produce(num);
    }
}



3.消费者

package com.test.thread;
/**
 * @author Administrator
 * 消费类
 */
public class Consumer extends Thread {
	
	// 每次消费的产品数量
	private int num;
	// 所在放置的仓库
	private Storage storage;
	// 构造函数,设置仓库
	public Consumer(Storage storage) {
		this.storage = storage;
	}

	// get/set方法
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public Storage getStorage() {
		return storage;
	}
	public void setStorage(Storage storage) {
		this.storage = storage;
	}
	//先run方法执行消费方法
	public void consume(int num) {
		storage.chuku(num);
	}
	
	@Override
    public void run() {
		consume(num);
	}
}

4.测试类

package com.test.thread;

import java.util.Random;

public class Test {
	public static void main(String[] args) {
//仓库
		Storage storage = new Storage();
//生产类
		Producer p1 = new Producer(storage);
//客户类		
		Consumer c1 = new Consumer(storage);
		Consumer c2 = new Consumer(storage);
		Consumer c3 = new Consumer(storage);
//要生产的数量
			p1.setNum(100);
//消费的数量随机的
			c1.setNum(new Random().nextInt(20));
			c2.setNum(new Random().nextInt(20));
			c3.setNum(new Random().nextInt(20));
//线程开始执行
			p1.start();

			c1.start();
			c2.start();
			c3.start();

	}
	
}



//运行结果

Java多线程____生产者与消费者模型_java



标签:Java,int,Storage,void,storage,____,num,多线程,public
From: https://blog.51cto.com/ratelcloud/7454304

相关文章

  • Java多线程____线程yield方法介绍
    packagecom.test.thread;publicclassTestYield{ publicstaticvoidmain(String[]args){ TestThreadt1=newTestThread("A_01"); TestThreadt2=newTestThread("B_02"); t1.start(); t2.start(); }}classTestThreadextend......
  • Java多线程____线程状态Join()方法
    代码:packagecom.test.thread;publicclassTestRunnableimplementsRunnable{ @Override publicvoidrun(){ synchronized(this){ for(inti=0;i<10;i++){ System.out.println(Thread.currentThread().getName()); } } } }packagecom......
  • Java多线程____线程状态Sleep()方法
    Sleep():在指定的毫秒数内让当前正在执行的线程休眠调用sleep方法时使当前的线程进入休眠状态(阻塞状态)设定休眠xxxx毫秒数后进入运行状态同步块中的Sleep方法调用不会释放对象锁但调用wait()方法会释放对象的同步锁packagecom.test.thread;publicclassTestRunnableimpleme......
  • Java多线程____线程状态变化
    1.初始化状态 :和其他对象一样线程对象被创建初始化中2.可运行状态:也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程 3. 运行状态(Running) :线程获取CPU权限进行执行。需要注意的是,线程只能从就绪状态进入到运行状态。4.......
  • 视图模板____Freemarker入门demo
    //工程结构//代码类packagecom.freemarker.test;importjava.io.File;importjava.io.FileWriter;importjava.io.PrintWriter;importjava.util.HashMap;importjava.util.Map;importfreemarker.template.Configuration;importfreemarker.temp......
  • Maven项目开发____maven开发环境的搭建
    //修改配置conf //配置环境变量//4.配置整合myeclipse......
  • Maven项目开发____Maven多模块开发亲测
    //4//5//6//7//8//9////b//c//d//e//f//g//h//i//j//k//l......
  • Java多线程____一个简单的多线程demo
    1.实现runnable接口实现功能性解耦 packagecom.test.thread;publicclassTestRunnableimplementsRunnable{ @Override publicvoidrun(){ for(inti=0;i<20;i++){ System.out.println(Thread.currentThread().getName()); } }}packagecom.test.thre......
  • Java安全架构____RSA加密配置第三方加密库问题_javax.crypto.BadPaddingException: De
    刚要写一个JCE组件是未使用第三方加密库时bug如下javax.crypto.BadPaddingException:Decryptionerroratsun.security.rsa.RSAPadding.unpadV15(UnknownSource)atsun.security.rsa.RSAPadding.unpad(UnknownSource)atcom.sun.crypto.provider.RSACipher.doFinal(RSACipher.j......
  • 异常:java.lang.ClassNotFoundException: org.apache.commons.collections.map.ListOr
    使用JSON,在SERVLET或者STRUTS的ACTION中取得数据时如果会出现异常:Java.lang.NoClassDefFoundError:net/sf/ezmorph/Morpher原因是少了JAR包,造成类找不到还必须有其它几个依赖包:commons-logging-1.0.4.jarcommons-lang-2.3.jarcommons-collections-3.2.jarcommons-beanutils-1......