线程调度例子
来源:互联网 发布:主流网管软件都有啥 编辑:程序博客网 时间: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);// 下一次执行的时间间隔单位。//----------------------------------模拟客户结束--------------------------------}}
阅读全文
1 0
- 线程调度例子
- 线程调度
- 线程调度
- 线程调度
- 线程调度
- 线程调度
- 线程调度
- 线程调度
- 线程调度
- 线程调度
- 线程调度
- Java线程: 线程调度
- 线程调度—优先级调度
- 线程的调度-守护线程
- 线程的调度-守护线程
- 线程调度的监视
- 线程调度算法分析
- WinCE线程调度
- 士兵杀敌(三)
- 第一章:1.1.3 典型信号
- 欢迎使用CSDN-markdown编辑器
- Python笔记01
- 全面理解SSD和NAND Flash
- 线程调度例子
- for循环与while循环/do...while循环
- java线程学习详解、总结!
- winhex系列2----sd卡格式化
- vim简单使用教程
- 伺服系统的摄像头标定(板球伺服控制系统)
- 编写C 代码,计算一个字节中被置 1 的位的个数(4种解法)
- Java并发编程实战(学习笔记九 第十章 避免活跃性危险)
- 手把手教你玩转Struts2