使用BlockingQueue实现生产者和消费者模式

package com.hjx.product_customer;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * 运行测试类
 * @author hjx
 *
 */
public class MainTest {
	 
	 public static void main(String[] args) {
		 
		 //存储所有线程的Map
		 Map<String,Runnable> runnabelMap =new HashMap<String,Runnable>();
		 
		 //仓库类
		 Storage storage =new Storage();
		 //这里使用带缓存功能的线程池
		 ExecutorService sercice = Executors.newCachedThreadPool(); 
		 Productor p1 = null;
		 Customer c1 = null;
		 String name ="";
		 //循环创建各100个生产者线程和消费者线程
		 for (int i = 0; i < 100; i++) {
			 name =i +"-p";
			 p1 = new Productor(true,storage,name);
			 runnabelMap.put(name, p1);
			 name =i + "-m";
			 c1 = new Customer(true,storage,name);
			 runnabelMap.put(name, c1);
			 sercice.submit(p1);
			 sercice.submit(c1);
		}
		
		
		try {
			//休眠10秒后
			TimeUnit.SECONDS.sleep(10); 
			
			//开始停止所有的线程
			Set set = runnabelMap.keySet();
			Iterator it = set.iterator();
			while (it.hasNext()) {
				String  keyName = (String ) it.next();
				BaseRunnable r = (BaseRunnable) runnabelMap.get(keyName);
				r.setGoing(false); //设置线程停止的标识
			}
			
			//休眠10秒后
			TimeUnit.SECONDS.sleep(10);
			
			//查看仓库里还有多少产品未消费。
			int count = storage.getQueue().size();
			System.out.println("仓库里未消费的产品数量: " + count);
			
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		 
		System.out.println("main is end!");
		 
		
	}

}



package com.hjx.product_customer;

import java.util.concurrent.TimeUnit;

/**
 * 生产者
 * @author hjx
 *
 */
public class Productor extends BaseRunnable {
	private Storage storage;
	private String name;
	public Productor(boolean isGoing,Storage storage,String name) {
		this.setGoing(isGoing);
		this.storage = storage;
		this.name = name;
	}

	@Override
	public void run() {
		while (this.isGoing()) {
			String pName ="产品" + (int)(Math.random() * 10000);
			ProductInfo productInfo =new ProductInfo(pName);
			try {
				storage.push(productInfo);
				
				System.out.println(name +" 生产产品: "+ productInfo.toString());
				
				TimeUnit.SECONDS.sleep(1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		System.out.println("生产者已经停止生产!");
	}

}


package com.hjx.product_customer;

import java.util.concurrent.TimeUnit;

/**
 * 消费者
 * @author hjx
 *
 */
public class Customer extends BaseRunnable {
	private Storage storage;
	private String name;
	public Customer(boolean isGoing,Storage storage,String name) {
		this.setGoing(isGoing);
		this.name = name;
		this.storage = storage;
	}

	@Override
	public void run() {
		
		while (this.isGoing()) {
			try {
				ProductInfo p = storage.pop();
				
				System.out.println(name +" 消费产品: " +p.toString());
				
				TimeUnit.SECONDS.sleep(1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

		System.out.println("消费者已经停止消费!");
		
	}

}



package com.hjx.product_customer;

/**
 * 产品对象
 * @author hjx
 *
 */

public class ProductInfo {
	private String name;
	
	public ProductInfo(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		return "ProductInfo [name=" + name + "]";
	}
}


package com.hjx.product_customer;

/**
 * 生产者、消费者的父类
 * @author hjx
 *
 */
public class BaseRunnable implements Runnable {
	
	private boolean isGoing;//生产者、消费者是否需要继续生产或者消费的条件

	public boolean isGoing() {
		return isGoing;
	}

	public void setGoing(boolean isGoing) {
		this.isGoing = isGoing;
	}

	@Override
	public void run() {
		System.out.println("父类方法");
	}

}


运行效果:





package wffz.jxmjkh.controller; import lombok.SneakyThrows; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import wffz.common.contants.ConstantProperties; import wffz.jxmjkh.service.JxMjKhTxService; import java.util.ArrayList; import java.util.List; import java.util.Map; public class SaveResultTask implements Runnable { private JxMjKhTxService jxMjKhTxService; // 上一次查询结果 private static List<Map<String, Object>> lastResult = new ArrayList<>(); private ConstantProperties constantProperties; public SaveResultTask(JxMjKhTxService jxMjKhTxService) { this.jxMjKhTxService = jxMjKhTxService; run(); } @SneakyThrows @Override public void run() { //查询表中的数据并保存在lastResult lastResult = jxMjKhTxService.getLastData(constantProperties.getJsbh()); // 获取当前接口查询结果 List<Map<String, Object>> result = jxMjKhTxService.selectJxMjkhTxData(constantProperties.getJsbh()); // 待插入的数据 List<Map<String, Object>> toBeInserted = new ArrayList<>(); // 待更新的数据 List<Map<String, Object>> toBeUpdated = new ArrayList<>(); // 待删除的数据 List<Map<String, Object>> toBeDeleted = new ArrayList<>(); // 遍历上一次查询结果,看看是否需要更新或删除 for (Map<String, Object> last : lastResult) { boolean found = false; for (Map<String, Object> current : result) { if (StringUtils.equals((CharSequence) current.get("jsbh"), (CharSequence) last.get("jsbh")) && StringUtils.equals((CharSequence) current.get("txxId"), (CharSequence) last.get("txxId")) && StringUtils.equals((CharSequence) current.get("sm"), (CharSequence) last.get("sm"))) { found = true; break; } } if (!found) { toBeDeleted.add(last); } } // 遍历当前查询结果,看看是否需要插入或更新 for (Map<String, Object> current : result) { boolean found = false; for (Map<String, Object> last : lastResult) { if (StringUtils.equals((CharSequence) current.get("jsbh"), (CharSequence) last.get("jsbh")) && StringUtils.equals((CharSequence) current.get("txxId"), (CharSequence) last.get("txxId")) && StringUtils.equals((CharSequence) current.get("sm"), (CharSequence) last.get("sm"))) { found = true; break; } } if (found) { toBeUpdated.add(current); } else { toBeInserted.add(current); } } // 批量插入 if (!toBeInserted.isEmpty()) { jxMjKhTxService.batchInsert(toBeInserted); } // 批量更新 if (!toBeUpdated.isEmpty()) { jxMjKhTxService.batchUpdate(toBeUpdated); } // 批量删除 if (!toBeDeleted.isEmpty()) { jxMjKhTxService.batchDelete(toBeDeleted); } // 保存本次查询结果 lastResult = result; } }代码不运行
05-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值