package bank; /** * This class is used for ... * @author dlf(460795365@qq.com) * @version 1.0, 2017年2月21日 下午10:10:46 */ public class Consumer { public Integer id; public String type; public Consumer(Integer id,String type){ this.id=id; this.type=type; } public void execute(){ try{ if (type.equals("normal")) { Thread.sleep(1000); return ; } if (type.equals("quick")) { Thread.sleep(300); return ; } if (type.equals("vip")) { Thread.sleep(1000); return ; } }catch(Exception exception){ exception.printStackTrace(); } } }
package bank; /** * This class is used for ... * * @author dlf(460795365@qq.com) * @version 1.0, 2017年2月21日 下午6:50:55 */ public abstract class Window { public int id; public String type; public Boolean isBusy; public void execute(Consumer client) { System.out.println(id + "号" + type + "业务员 开始办理" + client.id + "号" + client.type + "顾客的业务"); isBusy = true; client.execute(); isBusy = false; System.out.println(id + "号normal业务员 办理完了" + client.id + "号" + client.type + "顾客的业务"); } } class WindowForVIP extends Window { public WindowForVIP(int i) { id = i; type = "vip"; isBusy = false; } } class WindowForNormal extends Window { public WindowForNormal(int i) { id = i; type = "normal"; isBusy = false; } } class WindowForQuick extends Window { public WindowForQuick(int i) { id = i; type = "quick"; isBusy = false; } }
package bank; import java.util.ArrayList; import java.util.List; /** * This class is used for ... * @author dlf(460795365@qq.com) * @version 1.0, 2017年2月21日 下午7:55:34 */ public class WindowList { public List<WindowForNormal> normallist=new ArrayList<>(); public List<WindowForVIP> viplist=new ArrayList<>(); public List<WindowForQuick> quicklist=new ArrayList<>(); public WindowList(){ for(int i=1;i<5;i++) normallist.add(new WindowForNormal(i)); quicklist.add(new WindowForQuick(5)); viplist.add(new WindowForVIP(6)); } public Window getIdelVIPWindow(){ for(Window s:viplist){ if(!s.isBusy){ return s; } } return null; } public Window getIdelNormalWindow(){ for(Window s:normallist){ if(!s.isBusy){ return s; } } return null; } public Window getIdelQuickWindow(){ for(Window s:quicklist){ if(!s.isBusy){ return s; } } return null; } }
package bank; import java.util.Random; import java.util.concurrent.ArrayBlockingQueue; /** * This class is used for ... * @author dlf(460795365@qq.com) * @version 1.0, 2017年2月21日 下午7:01:18 */ public class Producer { //省略get/set方法 public ArrayBlockingQueue<Consumer> normals; public ArrayBlockingQueue<Consumer> vips; public ArrayBlockingQueue<Consumer> quicks; public void produce(){ Random random=new Random(); Random time=new Random(); int i=1; try { while (true) { //产生1-10 int type=random.nextInt(10)+1; if (type==1) { System.out.println("产生第"+i+"个客户,他是vip用户"); vips.put(new Consumer(i++, "vip")); }else if (type<5) { System.out.println("产生第"+i+"个客户,他是快速用户"); quicks.put(new Consumer(i++, "快速")); }else { System.out.println("产生第"+i+"个客户,他是普通用户"); normals.put(new Consumer(i++, "普通")); } Thread.sleep(time.nextInt(1000)); } } catch (Exception e) { // TODO: handle exception } } }
package bank; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * This class is used for ... * * @author dlf(460795365@qq.com) * @version 1.0, 2017年2月21日 下午7:14:18 */ public class Dispatcher { public static void main(String[] args) { final ExecutorService threadPool = Executors.newCachedThreadPool(); // 每个队伍 最多有10人 final ArrayBlockingQueue<Consumer> normals = new ArrayBlockingQueue<>(10); final ArrayBlockingQueue<Consumer> vips = new ArrayBlockingQueue<>(10); final ArrayBlockingQueue<Consumer> quicks = new ArrayBlockingQueue<>(10); final WindowList Windows = new WindowList(); final Producer producer = new Producer(); producer.setNormals(normals); producer.setQuicks(quicks); producer.setVips(vips); threadPool.execute(new Runnable() { public void run() { producer.produce(); } }); threadPool.execute(new Runnable() { public void run() { doVIP(threadPool, Windows, vips, normals, quicks); } }); threadPool.execute(new Runnable() { public void run() { doQuick(threadPool, Windows, vips, normals, quicks); } }); threadPool.execute(new Runnable() { public void run() { doNomal(threadPool, Windows, vips, normals, quicks); } }); threadPool.execute(new Runnable() { public void run() { try { while (true) { // http://blog.csdn.net/yingzishizhe/article/details/8769907 int threadCount = ((ThreadPoolExecutor) threadPool).getActiveCount(); System.out.println("现在活跃的线程数量为: " + threadCount); System.out.println("现在排队的人数为:" + (vips.size() + normals.size() + quicks.size())); Thread.sleep(3000); } } catch (Exception e) { e.printStackTrace(); } } }); } /** * @param threadPool * @param Windows * @param vips * @param normals * @param quicks */ private static void doQuick(ExecutorService threadPool, WindowList Windows, ArrayBlockingQueue<Consumer> vips, ArrayBlockingQueue<Consumer> normals, ArrayBlockingQueue<Consumer> quicks) { try { while (true) { // do vip final Window window = Windows.getIdelQuickWindow(); if (window != null) { int flag = 0; final Consumer id_quick = quicks.poll(10, TimeUnit.MILLISECONDS); if (id_quick != null) // quick里面有人 run(window,id_quick,threadPool); flag = 1; if (flag == 0) { final Consumer id_vip = vips.poll(10, TimeUnit.MILLISECONDS); if (id_vip != null) // quick里面没人 vip队伍里有人排队 run(window,id_vip,threadPool); flag = 1; } if (flag == 0) { final Consumer id_normal = normals.poll(10, TimeUnit.MILLISECONDS); if (id_normal != null) { // quick也没有人 vip队伍里没人排队 normal 里面有人 run(window,id_normal,threadPool); } } } else { // vip窗口正在忙 Thread.sleep(1000); } } } catch (Exception e) { e.printStackTrace(); } } /** * @param id_quick * @param threadPool */ private static void run(final Window window,final Consumer consumer, ExecutorService threadPool) { threadPool.execute(new Runnable() { public void run() { window.execute(consumer); } }); } /** * @param threadPool * @param list * @param vips */ private static void doNomal(ExecutorService threadPool, WindowList list, ArrayBlockingQueue<Consumer> vips, ArrayBlockingQueue<Consumer> normals, ArrayBlockingQueue<Consumer> quicks) { try { while (true) { // do vip final Window window = list.getIdelNormalWindow(); if (window != null) { int flag = 0; final Consumer id_normal = normals.poll(10, TimeUnit.MILLISECONDS); if (id_normal != null) // normal 里面有人 run(window,id_normal,threadPool); flag = 1; if (flag == 0) { final Consumer id_quick = quicks.poll(10, TimeUnit.MILLISECONDS); if (id_quick != null) // normal里面没人 quick里面有人 run(window,id_quick,threadPool); flag = 1; } if (flag == 0) { final Consumer id_vip = vips.poll(10, TimeUnit.MILLISECONDS); if (id_vip != null) // normal里面没人 normal里面没人 vip队伍里有人排队 run(window,id_vip,threadPool); flag = 1; } } else { // normal窗口正在忙 Thread.sleep(1000); } } } catch (Exception e) { e.printStackTrace(); } } /** * @param vips * @param list * @param threadPool * @param quicks * @param normals * */ private static void doVIP(ExecutorService threadPool, WindowList list, ArrayBlockingQueue<Consumer> vips, ArrayBlockingQueue<Consumer> normals, ArrayBlockingQueue<Consumer> quicks) { try { while (true) { // do vip final Window window = list.getIdelVIPWindow(); if (window != null) { // vip窗口空闲 // System.out.println("vips is null? "+vips==null); final Consumer id_vip = vips.poll(10, TimeUnit.MILLISECONDS); int flag = 0; if (id_vip != null) { // vip队伍里有人排队 run(window,id_vip,threadPool); flag = 1; } if (flag == 0) { final Consumer id_quick = quicks.poll(10, TimeUnit.MILLISECONDS); if (id_quick != null) // vip队伍里没人排队 quick里面有人 run(window,id_quick,threadPool); flag = 1; } if (flag == 0) { final Consumer id_normal = normals.poll(10, TimeUnit.MILLISECONDS); if (id_normal != null) // vip队伍里没人排队 quick也里面有人 normal 里面有人 run(window,id_normal,threadPool); } } else { // vip窗口正在忙 Thread.sleep(1000); } } } catch (Exception e) { e.printStackTrace(); } } }
原文:http://blog.csdn.net/dlf123321/article/details/56481207