多线程设计模式之Master-worker模式
36套java进阶高级架构师视频+38套大数据视频 保证全是硬货需要的
+微信:
du13797566440
* 主程序,创建初始化任务,开始任务,判断线程是否都执行完毕,获取结果
*
*/
public class main {
public static void main(String[] args) {
master master = new master(3);//创建一个消息转发器master, 初始化3个消息处理器worker
master.submit(100); //提交100个任务
master.excute();//执行renwu
while (true) {
//判断任务是否都执行完毕
boolean complete = master.isComplete();
if(complete){
ConcurrentHashMap<String,String> results = master.getResults();
for (Entry<String, String> rel: results.entrySet()) {
System.out.println(rel.getKey()+"-----"+rel.getValue());
}
break;
}
}
}
}
/**
* @author
* 一个 worker 就是一个线程
*/
public class master {
private ConcurrentLinkedQueue<task> tasks=new ConcurrentLinkedQueue<task>(); //要执行的任务参数
private ConcurrentHashMap<String, String> results=new ConcurrentHashMap<String, String>();//任务返回结果
private HashMap<String, Thread> workers=new HashMap<String, Thread>(); //任务执行者
//初始化master 同时创建i个worker
public master(int i) {
for (int j = 0; j <i; j++) {
workers.put("worker"+j,new Thread(new worker(this)) );
}
}
//提交任务
public void submit(int i) {
for (int j = 0; j < i; j++) {
task task = new task();
task.setId(j);
task.setName("任务"+j);
tasks.add(task);
}
}
//判断线程是否已经停止
public boolean isComplete() {
for (Map.Entry<String, Thread> worker : workers.entrySet()) {
if( worker.getValue().getState()!=Thread.State.TERMINATED){
return false;
}
}
return true;
}
//开启线程
public void excute() {
for (Map.Entry<String, Thread> worker : workers.entrySet()) {
worker.getValue().start();
}
}
}
/**
* 任务执行者 ,继承runnable接口 ,每个worker中都要有相同的master(获取任务,返回结果)
*
*/
public class worker implements Runnable {
private master master;
public worker(master master){
this.master=master;
}
public void run() {
while (true) {
ConcurrentLinkedQueue<task> tasks = master.getTasks();
task poll = tasks.poll();
if(poll==null) break; //当任务被取完后跳出循环
//...............此处执行业务,假设需要0.1秒
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("----------------------------"+Thread.currentThread().getName());
master.getResults().put(poll.getId()+"", poll.getName());//返回结果
}
}
}