Master-Worker模式,
Master-Worker模式
將某一部分的功能的系統分成兩個角色Master、Worker來處理請求。
Master它的職能是負責用戶端發送過來的請求、反饋回處理的結果以及分配任務。Worker它的職能就是處理子任務並把結果反饋給Master。這一模式和古代的分封制度有點類似。
就如Master對任務進行切分,並放入任務隊列;然後,觸發Worker處理任務。Master只做任務的接收、切分和結果統計,指定Worker的數量和效能指標,但不參與Worker的實際管理,而是交由第三方調度監控和調度Worker。這樣我們就可以將一個比較大的任務分成一個個小任務來處理,大大提高了系統的效能。在上述的圖片中,我們不一定要使用上述的容器,自己可以根據情況而選擇。
public class MasterMain { public static void main(String[] args) { Master master=new Master(new Worker(),10); for (int i=10;i<=100;i++){ Task task=new Task(); task.setId(i); task.setName("task"+i); task.setPrice(i); master.submit(task); } master.execute(); long start=System.currentTimeMillis(); while(true){ if(master.isExist()){ long end=System.currentTimeMillis()-start; long result=master.getResult(); System.out.println("任務執行時間為:"+end+"====結果集為:"+result); break; } } }}
public class Master { //1.承接任務的集合 ConcurrentLinkedQueue<Object> workqueue=new ConcurrentLinkedQueue<Object>(); //2.使用hashmap去承裝所有的worker對象 private HashMap<String ,Thread> workers=new HashMap<>(); //3.使用一個容器承裝每一個workers並發執行任務的結果集 private ConcurrentHashMap<String,Object> resultMap=new ConcurrentHashMap<>(); //4.構造方法 public Master(Worker worker,int workerCount){ //每個worker對象都需要有Master的引用,workqueue用於任務的領取,resultMap用於任務的提交 worker.setWorkerQueue(workqueue); worker.setResultMap(resultMap); for(int i=0;i<workerCount;i++){ //key表示每一個worker的名字,value表示線程執行對象 workers.put("任務"+Integer.toString(i),new Thread(worker)); } } //5.提交任務 public void submit(Object object){ this.workqueue.add(object); } //6.執行所有的worker工作 public void execute(){ for(Map.Entry<String,Thread> work:workers.entrySet()){ work.getValue().start(); } } //判斷是否結束 public boolean isExist(){ for(Map.Entry<String,Thread>exist: workers.entrySet()){ if(exist.getValue().getState() !=Thread.State.TERMINATED){ return false; } } return true; } //返回結果集 public long getResult(){ long result=0L; for (Map.Entry<String,Object> re:resultMap.entrySet()){ result+=(Integer) re.getValue(); } return result; }}
public class Worker implements Runnable { private ConcurrentLinkedQueue<Object> workerQueue; private ConcurrentHashMap<String,Object> resultMap; public void setWorkerQueue(ConcurrentLinkedQueue<Object> workerQueue){ this.workerQueue=workerQueue; } public void setResultMap(ConcurrentHashMap<String,Object> resultMap){ this.resultMap=resultMap; } @Override public void run() { while(true){ Task task= (Task) workerQueue.poll(); if(task==null) break;//說明沒有任務了 //處理業務 Object result = handle(task); //將結果集放到resultMap中 resultMap.put(Integer.toString(task.getId()),result); } } private Object handle(Task task){ Object result=null; try { Thread.sleep(500); result=task.getPrice(); } catch (InterruptedException e) { e.printStackTrace(); } return result; }}
public class Task { private int id; private String name; private int price; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; }}