16 Master-Worker模式

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;

}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章