今天简单的做了一下Master-Worker设计模式的Java实现
主要四个类,Master,Worker,Task,Result,还有一个测试类
Master类
package Master_Worker;
import java.util.HashMap;
import java.util.Map;
import java.util.Queue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.LinkedBlockingQueue;
import javax.swing.text.LayoutQueue;
public class Master {
private Queue<Task> tasks = new LinkedBlockingQueue<Task>();
private Map<String, Thread> allWorkerThread = new HashMap<String,Thread>();
public ConcurrentHashMap<String,Result> allResult = new ConcurrentHashMap<>();
public void addTask(Task t) {
tasks.add(t);
}
public Task getTask() {
return tasks.poll();
}
public void startANewTask() {
Task t = getTask();
if(t != null) {
Runnable worker = new Worker(t,allResult);
new Thread(worker).start();
}
}
public void print() {
int i = 0;
try{
for(i = 0;i < 100;i++) {
System.out.println(allResult.get("" + i).getValue());
}
}catch(java.lang.NullPointerException e) {
System.out.println(i);
e.printStackTrace();
}
}
}
Worker类
package Master_Worker;
import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
public class Worker implements Runnable{
Task t;
public ConcurrentHashMap<String,Result> allResult;
public Worker(Task t, ConcurrentHashMap<String,Result> allResult) {
// TODO Auto-generated constructor stub
this.t= t;
this.allResult = allResult;
}
@Override
public void run() {
work(t,allResult);
}
private void work(Task t2, ConcurrentHashMap<String,Result> allResult) {
//System.out.println(1);
Result<String> result = new Result("a");
allResult.put(""+ t2.getValue(),result);
System.out.println(1);
}
}
Result类
package Master_Worker;
public class Result<T> {
T r;
public Result(){
}
public Result(T r){
this.r = r;
}
public void setValue(T r) {
// TODO Auto-generated method stub
this.r = r;
}
public T getValue() {
return r;
}
}
Task类
package Master_Worker;
public class Task<T>{
public T value;
public Task(T value) {
this.value = value;
}
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
package Master_Worker;
public class Test {
public static void main(String[] args) throws InterruptedException {
Master m = new Master();
int i = 0;
for(i = 0;i < 100;i++) {
Task<Integer> t = new Task<Integer>(i);
m.addTask(t);
m.startANewTask();
}
while(m.allResult.size() != 100) {
}
m.print();
}
}