①.master負責手機客戶端的請求,將任務分發給work,回收work處理結果,java
②.work作具體的業務邏輯,並將結果通知到masterjson
這裏作了一個給每一個員工漲薪30%,並計算須要支付的薪資ide
具體實現:測試
master:this
private LinkedBlockingQueue<Money> queue = new LinkedBlockingQueue<Money>(); private ConcurrentHashMap<String, Money> resultMap = new ConcurrentHashMap<String, Money>(); private HashMap<Integer, Thread> workeMap = new HashMap<Integer, Thread>(); public Master(Work work, Integer workerCount) { if (workerCount <= 0) return; work.setQueue(queue); work.setResultMap(resultMap); for (int i = 0; i < workerCount; i++) { workeMap.put(i, new Thread(work, "T" + (i + 1))); } } public void putWorker(Money m) throws Exception { if (m == null) return; queue.add(m); } /** * 啓動全部工做進程 */ public void startWorker() { for (Map.Entry<Integer, Thread> entry : workeMap.entrySet()) { if(entry.getValue().getState() == Thread.State.NEW){ entry.getValue().start(); } } } /** * 每人工資漲薪30%,計算應付總額 * * @return */ public double sum() { double sum = 0; for (Map.Entry<String, Money> entry : resultMap.entrySet()) { sum += entry.getValue().getMoney(); } return sum; } /** * 全部工做線程是否都完畢 * * @return */ public boolean isCompleted() { for (Map.Entry<Integer, Thread> entry : workeMap.entrySet()) { if (entry.getValue().getState() != Thread.State.TERMINATED) return false; } return true; }work(可根據須要自行擴展):線程
private LinkedBlockingQueue<Money> queue = new LinkedBlockingQueue<Money>(); private ConcurrentHashMap<String, Money> resultMap = new ConcurrentHashMap<String, Money>(); @Override public void run() { try { while (true) { Thread.sleep(3000); Money money = this.queue.poll(); if (money == null) break; double nowMoney = money.getMoney() + (money.getMoney() * 0.3); System.out.println("工號:" + money.getId() + ",原工資:" + money.getMoney() + ",現工資:" + nowMoney + ",當前工做work:" + Thread.currentThread().getName()); money.setMoney(nowMoney); resultMap.put(money.getId(), money); } } catch (InterruptedException e) { e.printStackTrace(); } }測試:日誌
Master m = new Master(new Work(),5); m.putWorker(new Money("E1234567891", 2000.00)); m.putWorker(new Money("E1234567892", 1500.00)); m.putWorker(new Money("E1234567893", 6000.00)); m.putWorker(new Money("E1234567894", 4500.00)); m.putWorker(new Money("E1234567895", 2200.00)); m.putWorker(new Money("E1234567896", 3000.00)); m.putWorker(new Money("E1234567897", 5000.00)); m.putWorker(new Money("E1234567898", 7000.00)); m.putWorker(new Money("E1234567899", 6500.00)); m.putWorker(new Money("E1234567810", 2200.00)); m.startWorker(); long startTime = System.currentTimeMillis(); while (true) { if (m.isCompleted()) { System.out.println("結算總金額:" + m.sum() + "耗時:" + (System.currentTimeMillis() - startTime) + " ms"); break; } }控制檯日誌:code
工號:E1234567893,原工資:6000.0,現工資:7800.0,當前工做work:T4 工號:E1234567894,原工資:4500.0,現工資:5850.0,當前工做work:T1 工號:E1234567891,原工資:2000.0,現工資:2600.0,當前工做work:T2 工號:E1234567892,原工資:1500.0,現工資:1950.0,當前工做work:T5 工號:E1234567895,原工資:2200.0,現工資:2860.0,當前工做work:T3 工號:E1234567896,原工資:3000.0,現工資:3900.0,當前工做work:T2 工號:E1234567899,原工資:6500.0,現工資:8450.0,當前工做work:T1 工號:E1234567810,原工資:2200.0,現工資:2860.0,當前工做work:T5 工號:E1234567898,原工資:7000.0,現工資:9100.0,當前工做work:T3 工號:E1234567897,原工資:5000.0,現工資:6500.0,當前工做work:T4 結算總金額:51870.0耗時:9001 ms