Java使用线程并发库模拟弹夹装弹以及发射子弹的过程
生活随笔
收集整理的這篇文章主要介紹了
Java使用线程并发库模拟弹夹装弹以及发射子弹的过程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
同樣是從網上看到的一個需求,需求描述都在代碼中。
不多說了,直接貼代碼了。相信大家都能夠看得懂的!
package cn.yw.bore;import java.util.ArrayList; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;/*** 使用多線程模擬多線程裝彈及射出的過程(實際上這是一個生產者與消費者的問題)* * 要求:* 1.開啟3個線程裝彈,開啟2個線程發射子彈* 2.彈夾最多只能夠裝載12顆子彈* 3.一次只能夠發射一枚子彈,發射子彈的時候不能進行裝彈,在裝彈的時候不能進行發射。* 4.整個過程就是“裝載”、“發射”、“裝載”、“發射”、“裝載”、“發射”* @author yw-tony**/ public class ClipTest {public static void main(String[] args){final BoreManager manager = new BoreManager();//開啟3個線程裝彈for(int i=0;i<3;i++){new Thread(new Runnable(){@Overridepublic void run() {while(true){manager.loading();}}}).start();}//開啟兩個線程進行發射for(int i=0;i<2;i++){new Thread(new Runnable(){@Overridepublic void run() {while(true){manager.send();}}}).start();}}/*** 模擬裝彈以及發射的管理類* @author yw-tony**/static class BoreManager{int boreCount = 1;boolean flag = false;//線程開啟標記//隊列中對多存儲12個子彈ArrayBlockingQueue<Integer> blocking = new ArrayBlockingQueue<Integer>(12); // List<Integer> blocking = new ArrayList<Integer>();Lock lock = new ReentrantLock();Condition cond1 = lock.newCondition();Condition cond2 = lock.newCondition();/*** 發射*/public void send(){lock.lock();try{if(!flag){cond1.await();}if(blocking.size() == 0){flag = false;cond2.signal();}else{Integer i = blocking.take();System.out.println("發射第:"+i+"個子彈!");blocking.remove(i);//將該元素從隊列中移除Thread.sleep(100);//模擬子彈發射的慢過程 }}catch(Exception e){e.printStackTrace();}finally{lock.unlock();}}/*** 裝載*/public void loading(){lock.lock();try{if(flag){cond2.await();}if(blocking.size()==12){flag = true;cond1.signal();}else{blocking.put(boreCount);System.out.println("第:"+boreCount+"個子彈裝載完成!");Thread.sleep(100);//模擬裝彈慢過程boreCount++;}}catch(Exception e){e.printStackTrace();}finally{lock.unlock();}}} }?
總結
以上是生活随笔為你收集整理的Java使用线程并发库模拟弹夹装弹以及发射子弹的过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (转载)DevExpress ASPxG
- 下一篇: 水晶报表实现(一)