6.3 Master-Worker模式
Master-Worker模式是常用的並行計算模式,它的核心思想是系統由兩類進程協作工作:Master進程和Worker進程。Master負責接收和分配任務,Woker負責處理子任務。當各個Worker子進程處理完後,會將結果返回給Master,由Master做歸納和總結。其好處是能將一個大任務分解成若干小任務,並行執行,從而提高系統的吞吐量。
Master-Worker模式執行原理圖:
代碼示例:
/** * Client操作,建立任務進行提交執行 * @author Vision_TXG * */ public class MainTest {
public static void main(String[] args) { Random r = new Random(); Master master = new Master(new Worker(),10); System.out.println(Runtime.getRuntime().availableProcessors()); //Runtime.getRuntiem().availableProcessors(); 當前可使用的線程數 for(int i = 1;i<=100;i++) { Task t = new Task(); t.setId(i); t.setName("任務" + i); t.setPrice(r.nextInt(1000)); master.submit(t); } master.execute(); long start = System.currentTimeMillis(); /* * 循環判斷所有線程都執行完畢 */ while(true) { if(master.isComplete()) { long end = System.currentTimeMillis()-start; int ret = master.getResult(); System.out.println(ret + " 任務結束。。。耗時:"+end); break; } } }
}
/** * 如原理圖中Master * @author Vision_TXG * */ public class Master { //承裝任務的集合 private ConcurrentLinkedQueue<Task> workerQueue = new ConcurrentLinkedQueue<Task>(); //使用HashMap承裝所有的worker對象 private HashMap<String,Thread> workers = new HashMap<String,Thread>(); //使用一個容器承裝每一個worker並非執行任務的結果集 private ConcurrentHashMap<String,Object> resultMap = new ConcurrentHashMap<String,Object>(); //構造方法 public Master(Worker worker,int workerCount) { //每一個worker對象都要有一個Master的引用 ,workerQueue用於任務的領用,resultMap用於任務的提交 worker.setWorkerQueue(this.workerQueue); worker.setResultMap(this.resultMap); for(int i = 0;i< workerCount;i++) { //key爲每一個worker的名字,value表示線程執行對象 workers.put("子節點"+Integer.toString(i), new Thread(worker)); } } //提交方法 public void submit(Task task) { this.workerQueue.add(task); } //一個執行的方法用於啓動應用程序 public void execute() { for(Map.Entry<String,Thread> me :workers.entrySet() ) { me.getValue().start(); } } //判斷線程是否執行完畢 public boolean isComplete() { // TODO Auto-generated method stub for(Map.Entry<String, Thread> me : workers.entrySet()) { if(me.getValue().getState() != Thread.State.TERMINATED/*線程停止*/) { return false; } } return true; } //獲取業務結果 public int getResult() { // TODO Auto-generated method stub int ret = 0; for(Map.Entry<String, Object> me : resultMap.entrySet()) { ret += (Integer)me.getValue(); } return ret; } }
/** * 執行線程 * @author Vision_TXG * */ public class Worker implements Runnable {
private ConcurrentLinkedQueue<Task> workerQueue; private ConcurrentHashMap<String, Object> resultMap;
public void setWorkerQueue(ConcurrentLinkedQueue<Task> workerQueue) { // TODO Auto-generated method stub this.workerQueue = workerQueue; }
public void setResultMap(ConcurrentHashMap<String, Object> resultMap) { // TODO Auto-generated method stub this.resultMap = resultMap; }
@Override public void run() { // TODO Auto-generated method stub while(true) { Task input = this.workerQueue.poll(); if(input==null) { break; } //真正的做業務處理 Object ouput = handle(input); this.resultMap.put(Integer.toString(input.getId()), ouput); } }
private Object handle(Task input) { Object output = null; try { //表示處理task任務的耗時 Thread.sleep(500); output = input.getPrice(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } return output; // TODO Auto-generated method stub } }
/** * 實現類 * @author Vision_TXG * */ 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; } } |