模拟传送带工作模式
Channel 传送带
package com.dwz.concurrency2.chapter18; import java.util.Arrays; /** * 传送带 */ public class Channel { private final static int MAX_REQUEST = 100; private final Request[] requestQueue; private int head; private int tail; private int count; private final WorkerThread[] workerPool; public Channel(int workers) { this.requestQueue = new Request[MAX_REQUEST]; this.head = 0; this.tail = 0; this.count = 0; this.workerPool = new WorkerThread[workers]; this.init(); } private void init() { for(int i = 0; i < workerPool.length; i++) { workerPool[i] = new WorkerThread("Worker-" + i, this); } } /** * push switch to start all of worker to work. */ public void startWorker() { Arrays.asList(workerPool).forEach(WorkerThread::start); } public synchronized void put(Request request) { while (count >= requestQueue.length) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.requestQueue[tail] = request; this.tail = (tail + 1) % this.requestQueue.length; this.count++; this.notifyAll(); } public synchronized Request take() { while (count <= 0) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } Request request = this.requestQueue[head]; this.head = (this.head + 1) % this.requestQueue.length; this.count--; this.notifyAll(); return request; } }
Request 商品
package com.dwz.concurrency2.chapter18; /** * 商品 */ public class Request { private final String name; private final int number; public Request(String name, int number) { this.name = name; this.number = number; } public void execute() { System.out.println(Thread.currentThread().getName() + " executed " + this); } @Override public String toString() { return "Request=> No." + number + ", Name=>" + name; } }
TransportThread 向传送带上搬运线程
package com.dwz.concurrency2.chapter18; import java.util.Random; /** * 向传送带上搬运 */ public class TransportThread extends Thread { private final Channel channel; private static final Random random = new Random(System.currentTimeMillis()); public TransportThread(String name, Channel channel) { super(name); this.channel = channel; } @Override public void run() { try { for(int i = 0; true; i++) { Request request = new Request(getName(), i); this.channel.put(request); Thread.sleep(random.nextInt(1000)); } } catch (Exception e) { } } }
WorkerThread 从传送带上带走的线程
package com.dwz.concurrency2.chapter18; import java.util.Random; /** * 从传送带上带走 */ public class WorkerThread extends Thread { private final Channel channel; private static final Random random = new Random(System.currentTimeMillis()); public WorkerThread(String name, Channel channel) { super(name); this.channel = channel; } @Override public void run() { while (true) { channel.take().execute(); try { Thread.sleep(random.nextInt(1000)); } catch (InterruptedException e) { e.printStackTrace(); } } } }
测试
package com.dwz.concurrency2.chapter18; public class WorkerClient { public static void main(String[] args) { Channel channel = new Channel(5); channel.startWorker(); new TransportThread("Alex", channel).start(); new TransportThread("Jack", channel).start(); new TransportThread("William", channel).start(); } }