线程调度例子

来源:互联网 发布:主流网管软件都有啥 编辑:程序博客网 时间:2024/06/09 23:32


                                             线程调度例子



需求:

有三种对应类型的客户:vip客户、普通客户、快速客户,异步随机生成各种类型的客户,各类型客户在其对应窗口按顺序依次办理业务;其中vip窗口和快速窗口在空闲的时候可以为普通客户办理业务。


实现代码:

package com.ywx.bank;public class Constants {/** * 最大服务时间. */public static int MAX_SERVICE_TIME = 10000;/** * 最小服务时间. */public static int MIN_SERVICE_TIME = 1000;/** * 普通客户间隔时间. */public static int COMMON_CUSTOMER_INTERVAL_TIME = 1;}

package com.ywx.bank;public enum CustomerType {COMMON, EXPRESS, VIP;public String toString() {switch (this) {case COMMON:return "普通";case EXPRESS:return "快速";case VIP:return name();}return null;}}

package com.ywx.bank;/** * 取号机器类. */public class NumberMachine {private NumberManager commonManager = new NumberManager();private NumberManager expressManager = new NumberManager();private NumberManager vipManager = new NumberManager();public NumberManager getCommonManager() {return commonManager;}public NumberManager getExpressManager() {return expressManager;}public NumberManager getVipManager() {return vipManager;}private NumberMachine() {}private static NumberMachine instance = new NumberMachine();public static NumberMachine getInstance() {return instance;}}

package com.ywx.bank;import java.util.ArrayList;import java.util.List;/** * 取号管理. */public class NumberManager {private int lastNumber = 1;private List<Integer> queueNumber = new ArrayList<Integer>();/** * 生成服务号. *  * @return */public synchronized Integer generateNewNumber() {queueNumber.add(lastNumber);return lastNumber++;}/** * 取走服务号. *  * @return */public synchronized Integer fetchServiceNumber() {Integer number = null;if(queueNumber.size()>0){return queueNumber.remove(0);}return number;}}

package com.ywx.bank;import java.util.Random;import java.util.concurrent.Executors;/** * 服务窗口. */public class ServiceWindow {/** * 窗口类型. */private CustomerType type = CustomerType.COMMON;/** * 窗口ID. */private int windowId = 1;public void setType(CustomerType type) {this.type = type;}public void setWindowId(int windowId) {this.windowId = windowId;}public void start() {Executors.newSingleThreadExecutor().execute(new Runnable() {@Overridepublic void run() {while (true) {switch (type) {case COMMON:commonService();break;case EXPRESS:expressService();break;case VIP:vipService();break;}}}});}/** * 普通服务方法. */private void commonService() {String windowName = "第" + windowId + "号" + type + "窗口";Integer number = NumberMachine.getInstance().getCommonManager().fetchServiceNumber();System.out.println(windowName + "正在获取任务...");if (number != null) {System.out.println(windowName + "为第" + number + "个" + "普通" + "客户服务");long beginTime = System.currentTimeMillis();int maxRand = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;long serviceTime = new Random().nextInt(maxRand) + 1 + Constants.MIN_SERVICE_TIME;try {Thread.sleep(serviceTime);} catch (InterruptedException e) {e.printStackTrace();}long costTime = System.currentTimeMillis() - beginTime;System.out.println(windowName + "为第" + number + "个" + "普通" + "客户" + "完成服务,耗时" + costTime / 1000 + "秒!");} else {System.out.println(windowName + "没有取到服务任务,休息1秒钟!");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}/** * 快速服务方法. */private void expressService() {String windowName = "第" + windowId + "号" + type + "窗口";Integer number = NumberMachine.getInstance().getExpressManager().fetchServiceNumber();System.out.println(windowName + "正在获取任务...");if (number != null) {System.out.println(windowName + "为第" + number + "个" + type + "客户服务");long beginTime = System.currentTimeMillis();try {Thread.sleep(Constants.MIN_SERVICE_TIME);} catch (InterruptedException e) {e.printStackTrace();}long costTime = System.currentTimeMillis() - beginTime;System.out.println(windowName + "为第" + number + "个" + type + "客户" + "完成服务,耗时" + costTime / 1000 + "秒!");} else {System.out.println(windowName + "没有取到服务任务!");commonService();}}/** * vip服务方法. */private void vipService() {String windowName = "第" + windowId + "号" + type + "窗口";Integer number = NumberMachine.getInstance().getVipManager().fetchServiceNumber();System.out.println(windowName + "正在获取任务...");if (number != null) {System.out.println(windowName + "为第" + number + "个" + type + "客户服务");long beginTime = System.currentTimeMillis();try {Thread.sleep(Constants.MIN_SERVICE_TIME);} catch (InterruptedException e) {e.printStackTrace();}long costTime = System.currentTimeMillis() - beginTime;System.out.println(windowName + "为第" + number + "个" + type + "客户" + "完成服务,耗时" + costTime / 1000 + "秒!");} else {System.out.println(windowName + "没有取到服务任务!");commonService();}}}

package com.ywx.bank;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;public class MianClass {public static void main(String[] args) {/** * 创建3种类型窗口. *///----------------------------------模拟窗口开始--------------------------------for (int i = 0; i < 5; i++) {ServiceWindow commonWindow = new ServiceWindow();commonWindow.setWindowId(i);commonWindow.start();}ServiceWindow vipWindow = new ServiceWindow();vipWindow.setType(CustomerType.VIP);vipWindow.start();ServiceWindow expressWindow = new ServiceWindow();expressWindow.setType(CustomerType.EXPRESS);expressWindow.start();//----------------------------------模拟窗口结束--------------------------------//----------------------------------模拟客户开始--------------------------------/** * 模拟普通客户(模拟一个线程池). */Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {Integer number = NumberMachine.getInstance().getInstance().getCommonManager().generateNewNumber();System.out.println(number+"号普通客户等待服务!");}}, //0, // 表示多长时间从第一个开始,此处立即执行。Constants.COMMON_CUSTOMER_INTERVAL_TIME,// 下一次执行的时间间隔。TimeUnit.SECONDS);// 下一次执行的时间间隔单位。/** * 模拟vip客户(模拟一个线程池). */Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {Integer number = NumberMachine.getInstance().getInstance().getVipManager().generateNewNumber();System.out.println(number+"号vip客户等待服务!");}}, //0, // 表示多长时间从第一个开始,此处立即执行。Constants.COMMON_CUSTOMER_INTERVAL_TIME * 6,// 下一次执行的时间间隔。TimeUnit.SECONDS);// 下一次执行的时间间隔单位。/** * 模拟快速客户(模拟一个线程池). */Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {Integer number = NumberMachine.getInstance().getInstance().getExpressManager().generateNewNumber();System.out.println(number+"号快速客户等待服务!");}}, //0, // 表示多长时间从第一个开始,此处立即执行。Constants.COMMON_CUSTOMER_INTERVAL_TIME * 3,// 下一次执行的时间间隔。TimeUnit.SECONDS);// 下一次执行的时间间隔单位。//----------------------------------模拟客户结束--------------------------------}}