java 多线程 master worker模式

来源:互联网 发布:中国进口 知乎 编辑:程序博客网 时间:2024/05/19 17:10
package com.example.design.master_worker;import java.lang.Thread.State;import java.util.ArrayList;import java.util.HashMap;import java.util.LinkedHashMap;import java.util.List;import java.util.Map;import java.util.Queue;import java.util.concurrent.LinkedBlockingQueue;public class Master {/** * 要做的事 */Queue<Work> works = new LinkedBlockingQueue<Work>();/** * 分配几个人来做相当于工人 */List<Thread> Workers = new ArrayList<Thread>();/** * 结果 key对应的事 value事的结果 */ArrayList<Object> results = new ArrayList<Object>();public Master(int runCount, Worker worker) {worker.setValue(works, results);for (int i = 0; i <= runCount; i++) {Workers.add(new Thread(worker));}}public void submit(Work w) {works.add(w);}public void execute() {for (Thread run : Workers) {run.start();}}/** * 判断线程是否全部终止 *  * @return true 有未完成 */public boolean checkIsComplete() {for (Thread run : Workers) {if ((run.getState() != State.TERMINATED)) {return true;}}return false;}}

package com.example.design.master_worker;public abstract class Work {Object obj;public Work(Object obj) {super();this.obj = obj;}public abstract Object handler();public Object getParm() {return obj;};}


package com.example.design.master_worker;import java.util.ArrayList;import java.util.Map;import java.util.Queue;public class Worker implements Runnable {Queue<Work> works;ArrayList<Object> results;public void setValue(Queue<Work> works, ArrayList<Object> results) {this.works = works;this.results = results;}@Overridepublic void run() {while (true) {Work work = works.poll();if (work == null) {break;}Object result = work.handler();results.add(result);}}}



package com.example.design.master_worker;public class Work1 extends Work {public Work1(Object obj) {super(obj);}@Overridepublic Object handler() {int i = (Integer) obj;int t = i * i * i;return t;}}

private static void masterTest(int t) {Worker worker = new Worker();Master master = new Master(5, worker);for (int i = 0; i <= t; i++) {master.submit(new Work1(i));}master.execute();int result = 0;ArrayList<Object> results = master.results;while (results.size() > 0 || master.checkIsComplete()) {if (results.size() > 0) {result += (Integer) results.remove(0);}}System.out.println(result);}