黑马程序员技术交流社区
标题:
学银行调度系统的时候,关系有点乱,求大神帮忙屡屡
[打印本页]
作者:
葛奎
时间:
2012-11-21 20:18
标题:
学银行调度系统的时候,关系有点乱,求大神帮忙屡屡
package cn.itcast.bankqueue;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
public class MainClass {
private static Logger logger = Logger.getLogger("cn.itcast.bankqueue");
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(CustomerType.EXPRESS);
expressWindow.start();
//产生1个VIP窗口
ServiceWindow vipWindow = new ServiceWindow();
vipWindow.setType(CustomerType.VIP);
vipWindow.start();
//普通客户拿号
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run(){
Integer serviceNumber = NumberMachine.getInstance().getCommonManager().generateNewNumber();
/**
* 采用logger方式,无法看到直观的运行效果,因为logger.log方法内部并不是直接把内容打印出出来,
* 而是交给内部的一个线程去处理,所以,打印出来的结果在时间顺序上看起来很混乱。
*/
//logger.info("第" + serviceNumber + "号普通客户正在等待服务!");
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);
}
}
//给了开启的窗口和用户拿完号之后,他们是怎么联系工作的,线程是怎么运转的?越详细越好 谢啦
作者:
王阳
时间:
2012-11-23 21:00
这个就不一定了,多个线程自动运行,至于联系工作,紧紧是因为NumberManager里面的两个方法被同步了,这也就保证了,再同一时间只会有一个线程进入,而且NumberMachine这个类里面是单例,并且封装了三个NumberManager对象,然后在窗口服务和主函数创建客户时分别调用了对应的方法,所以各个线程互不干涉,有则执行,没有则等待,不过如果是非普通窗口,等待结束后就会去调用普通窗口服务,获取普通客户,这个时候如果有则为普通客户服务,没有则继续等待,然后再次进入switch块里面,会再次跟进自己的类型调用自己的方法,如此循环下去
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2