三十七、多线程的两种模式
来源:互联网 发布:淘宝微淘收藏在哪看 编辑:程序博客网 时间:2024/05/14 04:01
下面用两种模式(masterWorker和guardedSuspension)的多线程地来实现1*1*1+2*2*2+...+100*100*100操作。
一、masterWorker
package com.exercise.masterWorker;import java.util.Map;import java.util.Set;public class Client {public static void main(String[] args) {Master m = new Master(new PlusWorker(),5);//5个线程for (int i = 0; i < 100; i++) {//100个 任务m.submit(i);}m.execute();int re = 0;Map<String,Object> resultMap = m.getResultMap();while(resultMap.size()>0 || !m.isComplete()){System.out.println("resultMap.size()="+resultMap.size());Set<String> keys = resultMap.keySet();String key = null;for(String k:keys){key = k;System.out.println("key="+key);break;}Integer i = null;if(key!=null){i = (Integer) resultMap.get(key);}if(i!=null){re+=i;}if(key!=null){resultMap.remove(key);}}System.out.println("result="+re);}}
package com.exercise.masterWorker;import java.util.HashMap;import java.util.Map;import java.util.Queue;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.ConcurrentLinkedQueue;public class Master {protected Queue<Object> workQueue = new ConcurrentLinkedQueue<Object>();protected Map<String,Thread> threadMap = new HashMap<String,Thread>();protected Map<String,Object> resultMap = new ConcurrentHashMap<String,Object>();public Master(Worker worker,int countWorker){worker.setWorkQueue(workQueue);worker.setResultMap(resultMap);for (int i = 0; i < countWorker; i++) {threadMap.put(Integer.toString(i), new Thread(worker,Integer.toString(i)));}}public void submit(Object job){workQueue.add(job);}public void execute(){for(Map.Entry<String, Thread> entry : threadMap.entrySet()){entry.getValue().start();}}public Map<String,Object> getResultMap(){return resultMap;}public boolean isComplete(){for(Map.Entry<String, Thread> entry : threadMap.entrySet()){if(entry.getValue().getState()!=Thread.State.TERMINATED){return false;}}return true;}}
package com.exercise.masterWorker;import java.util.Map;import java.util.Queue;public class Worker implements Runnable{protected Queue<Object> workQueue;protected Map<String,Object> resultMap;public Queue<Object> getWorkQueue() {return workQueue;}public void setWorkQueue(Queue<Object> workQueue) {this.workQueue = workQueue;}public Map<String, Object> getResultMap() {return resultMap;}public void setResultMap(Map<String, Object> resultMap) {this.resultMap = resultMap;}@Overridepublic void run() {while(true){Object input = workQueue.poll();if(input==null) break;Object re = handle(input);resultMap.put(Integer.toString((Integer)input), re);}}public Object handle(Object input){return input;}}
package com.exercise.masterWorker;public class PlusWorker extends Worker{public Object handle(Object input){Integer i = (Integer) input;return i*i*i;}}
二、guardedSuspension
package com.exercise.guardedSuspension;import java.util.ArrayList;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;public class Client2 {public static void main(String[] args){RequestQueue2 requestQueue2 = new RequestQueue2();for (int i = 1; i <= 100; i++) {new ClientThread2(requestQueue2,i).start();}int sum = 0;ExecutorService exec = Executors.newCachedThreadPool(); <span style="white-space:pre"></span>ArrayList<Future<Integer>> results = new ArrayList<Future<Integer>>(); <span style="white-space:pre"></span>for (int i = 1; i <= 100; i++) { <span style="white-space:pre"></span>results.add(exec.submit(new ServerThread2(requestQueue2))); <span style="white-space:pre"></span>} <span style="white-space:pre"></span>for (Future<Integer> future : results) { <span style="white-space:pre"></span>try {sum+=future.get();} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();} <span style="white-space:pre"></span>} <span style="white-space:pre"></span>System.out.println("sum="+sum); <span style="white-space:pre"></span>exec.shutdown(); }}
package com.exercise.guardedSuspension;import java.util.LinkedList;public class RequestQueue2 {private LinkedList queue2 = new LinkedList();public synchronized Request2 getRequest2(){while(queue2.size()==0){try{wait();}catch(InterruptedException e){}}return (Request2) queue2.remove();}public synchronized void addRequest2(Request2 request2){queue2.add(request2);notifyAll();}}
package com.exercise.guardedSuspension;public class Request2 {private int num;private Data2 response;public int getNum() {return num;}public Request2(int num){this.num=num;}public Data2 getResponse() {return response;}public void setResponse(Data2 response) {this.response = response;}}
package com.exercise.guardedSuspension;public class ClientThread2 extends Thread{private int num;private RequestQueue2 requestQueue2;public ClientThread2(RequestQueue2 requestQueue2,int num){this.requestQueue2 = requestQueue2;this.num = num;}public void run(){Request2 request2 = new Request2(num);requestQueue2.addRequest2(request2);try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}
package com.exercise.guardedSuspension;import java.util.concurrent.Callable;public class ServerThread2 implements Callable<Integer>{private RequestQueue2 requestQueue2;public ServerThread2(RequestQueue2 requestQueue2){this.requestQueue2 = requestQueue2;}public Integer call() throws Exception {while(true){try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}Request2 request2 = requestQueue2.getRequest2();return request2.getNum()*request2.getNum()*request2.getNum();}}}
package com.exercise.guardedSuspension;public class Request2 {private int num;public int getNum() {return num;}public Request2(int num){this.num=num;}}
0 0
- 三十七、多线程的两种模式
- 多线程环境下单例模式的两种实现方法
- 多线程的两种方法
- 多线程的两种方式
- 两种模式多线程的解决方案[2004年4月29日 10:53]
- java 多线程并发系列之 生产者消费者模式的两种实现
- 单例模式 (两种)及多线程下的优化
- java 多线程并发系列之 生产者消费者模式的两种实现
- 多线程的创建的两种方法
- Singleton的两种模式
- RA的两种模式
- epoll的两种模式
- 别踩白块的两种模式
- Java实现多线程的两种方式
- 5.7多线程同步的两种方式
- java实现多线程的两种方法
- java实现多线程的两种方法
- 多线程 创建线程的两种方式
- Git常用命令解说
- UVA 10006 Carmichael Numbers
- Android图片压缩小结
- 『黑马程序员』第十二话<交通灯系统>
- 经纬财富:遵义黄金白银即时分析(晚评)
- 三十七、多线程的两种模式
- OCP 1Z0 053 192
- JavaScript拼接Sql参数字符串‘A’,‘B’,‘C’
- 进行修改操作时,没有修改数据,造成的失败问题!
- 栈实现括号匹配
- Android系统中的一个应用中启动多个进程
- cocos2dx读书笔记(Box2D 物理引擎)
- 结构风险最小化
- 提高SQL查询效率