对象分析:
1.客户类按照业务分类,客户可以分成三类。
public enum Custommer {
COMMON ,VIP , EXPRESS;
public String toString(){
String name =null ;
switch (this ){
case COMMON
name ="普通"
break;
case VIP
name ="VIP"
break;
case EXPRESS
name ="快速"
break;
}
return name;
}
}
2.号码机类。号码机用于产生各种号码管理类。
public class NumberMachine {
private NumberMachine(){}
private static NumberMachine instance= new NumberMachine()
public static NumberMachine getInstance (){
return instance
}
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
}
}
3.号码管理类。号码机管理类主要作用存放号码,给外界提供号码信息。
import java. util.*;
public class NumberManager {
private int lastnumber= 0;
private List queueNumber= new ArrayList ();
public synchronized Integer generateNewNumber (){
queueNumber .add ( lastnumber++ );
return lastnumber
}
public synchronized Integer fetchNumber (){
if (queueNumber .size ()> 0 )
return ( Integer ) queueNumber. remove (0 );
else return null;
}
}
4.服务窗口类。为客户提供服务
public class ServiceWindow {
Custommer type= Custommer. COMMON;
public Custommer getType() {
return type
}
public void setType (Custommer type ) {
this. type = type;
}
public int getNumber () {
return number
}
public void setNumber (int number ) {
this. number = number;
}
int number =1
public void start (){
Executors .newSingleThreadExecutor () .execute ( new Runnable (){
public void run () {
// TODO Auto-generated method stub
while ( true )
switch ( type ){
case COMMON
commonService ();
break;
case VIP
vipService ();
break;
case EXPRESS
expressService ();
}
}
})
}
private void commonService () {
// TODO Auto-generated method stub
String windowName = "第" + number + "号" + type + "窗口" ;
System . out. println( windowName + "开始获取普通任务!" );
Integer serviceNumber = NumberMachine.getInstance (). getCommonManager (). fetchNumber() ;
if (serviceNumber != null ){
System . out. println( windowName + "开始为第" + serviceNumber + "号普通客户服务" );
int maxRandom = Constants. MAX_SERVICE_TIME - Constants. MIN_SERVICE_TIME;
int serviceTime = new Random (). nextInt( maxRandom )+ 1 + Constants. MIN_SERVICE_TIME;
try {
Thread .sleep (serviceTime );
} catch (InterruptedException e ) {
e .printStackTrace ();
}
System . out. println( windowName + "完成为第" + serviceNumber + "号普通客户服务,总共耗时" +serviceTime/ 1000 + "秒") ;
} else{
System . out. println( windowName + "没有取到普通任务,正在空闲一秒" );
try {
Thread .sleep (1000 );
} catch (InterruptedException e ) {
e .printStackTrace ();
}
}
}
private void vipService () {
// TODO Auto-generated method stub
Integer serviceNumber = NumberMachine.getInstance (). getExpressManager (). fetchNumber()
String windowName = "第" + number + "号" + type + "窗口" ;
System . out. println( windowName + "开始获取快速任务!" );
if (serviceNumber != null){
System . out. println( windowName + "开始为第" + serviceNumber + "号快速客户服务" );
int serviceTime = Constants. MIN_SERVICE_TIME;
try {
Thread .sleep (serviceTime );
} catch (InterruptedException e ) {
e .printStackTrace ();
}
System . out. println( windowName + "完成为第" + serviceNumber + "号快速客户服务,总共耗时" +serviceTime/ 1000 + "秒") ;
} else{
System . out. println( windowName + "没有取到快速任务!" );
commonService ();
}
}
private void expressService () {
// TODO Auto-generated method stub
Integer serviceNumber = NumberMachine.getInstance (). getVipManager (). fetchNumber()
String windowName = "第" + number + "号" + type + "窗口" ;
System . out. println( windowName + "开始获取VIP任务!" );
if (serviceNumber != null){
System . out. println( windowName + "开始为第" + serviceNumber + "号VIP客户服务" );
int maxRandom = Constants. MAX_SERVICE_TIME - Constants. MIN_SERVICE_TIME;
int serviceTime = new Random (). nextInt( maxRandom )+ 1 + Constants. MIN_SERVICE_TIME;
try {
Thread .sleep (serviceTime );
} catch (InterruptedException e ) {
e .printStackTrace ();
}
System . out. println( windowName + "完成为第" + serviceNumber + "号VIP客户服务,总共耗时" +serviceTime/ 1000 + "秒") ;
} else{
System . out. println( windowName + "没有取到VIP任务!" );
commonService ();
}
}
}
5.测试类类。
class Constants {
public final static int MAX_SERVICE_TIME =10
public final static int MIN_SERVICE_TIME =1
public static int COMMON_CUSTOMER_INTERVAL_TIME = 1;
}
public class MainClass {
private static Logger logger = Logger .getLogger ("threadTest" );
public static void main ( String[] args ) {
//产生4个普通窗口
for (int i= 1; i< 5; i++ ){
ServiceWindow window = new ServiceWindow()
window .setNumber ( i)
window .start ();
}
//产生1个快速窗口
ServiceWindow expressWindow = new ServiceWindow()
expressWindow .setType ( Custommer. EXPRESS)
expressWindow .start ();
//产生1个VIP窗口
ServiceWindow vipWindow = new ServiceWindow()
vipWindow .setType ( Custommer. VIP)
vipWindow .start ();
//普通客户拿号
Executors .newScheduledThreadPool ( 1) .scheduleAtFixedRate (
new Runnable(){
public void run (){
Integer serviceNumber = NumberMachine.getInstance (). getCommonManager (). generateNewNumber()
System . out. println( "第" + serviceNumber + "号普通客户正在等待服务!" );
}
},
0
Constants . COMMON_CUSTOMER_INTERVAL_TIME,
TimeUnit . SECONDS)
//快速客户拿号
Executors .newScheduledThreadPool ( 1) .scheduleAtFixedRate (
new Runnable(){
public void run (){
Integer serviceNumber = NumberMachine.getInstance (). getExpressManager (). generateNewNumber()
System . out. println( "第" + serviceNumber + "号快速客户正在等待服务!" );
}
},
0
Constants . COMMON_CUSTOMER_INTERVAL_TIME * 2
TimeUnit . SECONDS)
//VIP客户拿号
Executors .newScheduledThreadPool ( 1) .scheduleAtFixedRate (
new Runnable(){
public void run (){
Integer serviceNumber = NumberMachine.getInstance (). getVipManager (). generateNewNumber()
System . out. println( "第" + serviceNumber + "号VIP客户正在等待服务!" );
}
},
0
Constants . COMMON_CUSTOMER_INTERVAL_TIME * 6
TimeUnit . SECONDS)
}
1.客户类按照业务分类,客户可以分成三类。
public enum Custommer {
COMMON ,VIP , EXPRESS;
public String toString(){
String name =null ;
switch (this ){
case COMMON
name ="普通"
break;
case VIP
name ="VIP"
break;
case EXPRESS
name ="快速"
break;
}
return name;
}
}
2.号码机类。号码机用于产生各种号码管理类。
public class NumberMachine {
private NumberMachine(){}
private static NumberMachine instance= new NumberMachine()
public static NumberMachine getInstance (){
return instance
}
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
}
}
3.号码管理类。号码机管理类主要作用存放号码,给外界提供号码信息。
import java. util.*;
public class NumberManager {
private int lastnumber= 0;
private List queueNumber= new ArrayList ();
public synchronized Integer generateNewNumber (){
queueNumber .add ( lastnumber++ );
return lastnumber
}
public synchronized Integer fetchNumber (){
if (queueNumber .size ()> 0 )
return ( Integer ) queueNumber. remove (0 );
else return null;
}
}
4.服务窗口类。为客户提供服务
public class ServiceWindow {
Custommer type= Custommer. COMMON;
public Custommer getType() {
return type
}
public void setType (Custommer type ) {
this. type = type;
}
public int getNumber () {
return number
}
public void setNumber (int number ) {
this. number = number;
}
int number =1
public void start (){
Executors .newSingleThreadExecutor () .execute ( new Runnable (){
public void run () {
// TODO Auto-generated method stub
while ( true )
switch ( type ){
case COMMON
commonService ();
break;
case VIP
vipService ();
break;
case EXPRESS
expressService ();
}
}
})
}
private void commonService () {
// TODO Auto-generated method stub
String windowName = "第" + number + "号" + type + "窗口" ;
System . out. println( windowName + "开始获取普通任务!" );
Integer serviceNumber = NumberMachine.getInstance (). getCommonManager (). fetchNumber() ;
if (serviceNumber != null ){
System . out. println( windowName + "开始为第" + serviceNumber + "号普通客户服务" );
int maxRandom = Constants. MAX_SERVICE_TIME - Constants. MIN_SERVICE_TIME;
int serviceTime = new Random (). nextInt( maxRandom )+ 1 + Constants. MIN_SERVICE_TIME;
try {
Thread .sleep (serviceTime );
} catch (InterruptedException e ) {
e .printStackTrace ();
}
System . out. println( windowName + "完成为第" + serviceNumber + "号普通客户服务,总共耗时" +serviceTime/ 1000 + "秒") ;
} else{
System . out. println( windowName + "没有取到普通任务,正在空闲一秒" );
try {
Thread .sleep (1000 );
} catch (InterruptedException e ) {
e .printStackTrace ();
}
}
}
private void vipService () {
// TODO Auto-generated method stub
Integer serviceNumber = NumberMachine.getInstance (). getExpressManager (). fetchNumber()
String windowName = "第" + number + "号" + type + "窗口" ;
System . out. println( windowName + "开始获取快速任务!" );
if (serviceNumber != null){
System . out. println( windowName + "开始为第" + serviceNumber + "号快速客户服务" );
int serviceTime = Constants. MIN_SERVICE_TIME;
try {
Thread .sleep (serviceTime );
} catch (InterruptedException e ) {
e .printStackTrace ();
}
System . out. println( windowName + "完成为第" + serviceNumber + "号快速客户服务,总共耗时" +serviceTime/ 1000 + "秒") ;
} else{
System . out. println( windowName + "没有取到快速任务!" );
commonService ();
}
}
private void expressService () {
// TODO Auto-generated method stub
Integer serviceNumber = NumberMachine.getInstance (). getVipManager (). fetchNumber()
String windowName = "第" + number + "号" + type + "窗口" ;
System . out. println( windowName + "开始获取VIP任务!" );
if (serviceNumber != null){
System . out. println( windowName + "开始为第" + serviceNumber + "号VIP客户服务" );
int maxRandom = Constants. MAX_SERVICE_TIME - Constants. MIN_SERVICE_TIME;
int serviceTime = new Random (). nextInt( maxRandom )+ 1 + Constants. MIN_SERVICE_TIME;
try {
Thread .sleep (serviceTime );
} catch (InterruptedException e ) {
e .printStackTrace ();
}
System . out. println( windowName + "完成为第" + serviceNumber + "号VIP客户服务,总共耗时" +serviceTime/ 1000 + "秒") ;
} else{
System . out. println( windowName + "没有取到VIP任务!" );
commonService ();
}
}
}
5.测试类类。
class Constants {
public final static int MAX_SERVICE_TIME =10
public final static int MIN_SERVICE_TIME =1
public static int COMMON_CUSTOMER_INTERVAL_TIME = 1;
}
public class MainClass {
private static Logger logger = Logger .getLogger ("threadTest" );
public static void main ( String[] args ) {
//产生4个普通窗口
for (int i= 1; i< 5; i++ ){
ServiceWindow window = new ServiceWindow()
window .setNumber ( i)
window .start ();
}
//产生1个快速窗口
ServiceWindow expressWindow = new ServiceWindow()
expressWindow .setType ( Custommer. EXPRESS)
expressWindow .start ();
//产生1个VIP窗口
ServiceWindow vipWindow = new ServiceWindow()
vipWindow .setType ( Custommer. VIP)
vipWindow .start ();
//普通客户拿号
Executors .newScheduledThreadPool ( 1) .scheduleAtFixedRate (
new Runnable(){
public void run (){
Integer serviceNumber = NumberMachine.getInstance (). getCommonManager (). generateNewNumber()
System . out. println( "第" + serviceNumber + "号普通客户正在等待服务!" );
}
},
0
Constants . COMMON_CUSTOMER_INTERVAL_TIME,
TimeUnit . SECONDS)
//快速客户拿号
Executors .newScheduledThreadPool ( 1) .scheduleAtFixedRate (
new Runnable(){
public void run (){
Integer serviceNumber = NumberMachine.getInstance (). getExpressManager (). generateNewNumber()
System . out. println( "第" + serviceNumber + "号快速客户正在等待服务!" );
}
},
0
Constants . COMMON_CUSTOMER_INTERVAL_TIME * 2
TimeUnit . SECONDS)
//VIP客户拿号
Executors .newScheduledThreadPool ( 1) .scheduleAtFixedRate (
new Runnable(){
public void run (){
Integer serviceNumber = NumberMachine.getInstance (). getVipManager (). generateNewNumber()
System . out. println( "第" + serviceNumber + "号VIP客户正在等待服务!" );
}
},
0
Constants . COMMON_CUSTOMER_INTERVAL_TIME * 6
TimeUnit . SECONDS)
}