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