黑马程序员技术交流社区
标题: 关于银行业务模拟的问题 [打印本页]
作者: 朱亚安 时间: 2012-3-25 01:47
标题: 关于银行业务模拟的问题
按照老师的思路,我自己敲了一遍代码。但是运行的时候:
---------------start---------------------------------------------------
1号COMMON窗口任务获取失败,休息1秒!!!
3号COMMON窗口正在获取服务任务!!!
5号QUICK窗口正在获取服务任务!!!
---------------start---------------------------------------------------
2号COMMON窗口正在获取服务任务!!!
---------------start---------------------------------------------------
3号COMMON窗口任务获取失败,休息1秒!!!
4号COMMON窗口正在获取服务任务!!!
4号COMMON窗口任务获取失败,休息1秒!!!
1号COMMON窗口正在获取服务任务!!!
5号QUICK窗口为第1号QUICK客户服务耗时1秒
---------------end---------------------------------------------------
有一部分是这样显示的。但是我的这个标记start,应该是和其对应的end也应该输出的呀,上面的两个start为什么没有对应start输出呢。
这里是部分代码:
private void commonSever() {
Integer number = NumberMachine.getInstance().getCommonManager().fetchNumber();
System.out.println(windowId +"号"+type+"窗口正在获取服务任务!!!");
if(number!=null){
synchronized (type) {
System.out
.println("---------------start---------------------------------------------------");
long startTime = System.currentTimeMillis();
int maxRandom = Constants.MAX_SEVER_TIME
- Constants.MIN_SEVER_TIME;
int severTime = new Random().nextInt(maxRandom) + 1
+ Constants.MIN_SEVER_TIME;
try {
Thread.sleep(severTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long costTime = System.currentTimeMillis() -startTime;
System.out.println(windowId + "号" + type + "窗口为第" + number
+ "号普通客户服务耗时" + costTime / 1000 + "秒");
System.out
.println("---------------end---------------------------------------------------");
}
}else{
System.out.println(windowId +"号"+type+"窗口任务获取失败,休息1秒!!!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
而且我把里面的锁住了,为什么还会跳出去呢。这个我就弄不明白了。谁知道怎么来解决给个建议吧。。。。
作者: 田斌 时间: 2012-3-25 03:20
看你的代码开始还没有客户,所以还没有执行System.out.println(windowId + "号" + type + "窗口为第" + number
+ "号普通客户服务耗时" + costTime / 1000 + "秒");当然也不会执行到System.out
.println("---------------end---------------------------------------------------");
等到客户出现并服务后才会有end输出。
作者: 黄云南 时间: 2012-3-25 05:29
出现你这种情况用多线程同步的两个前提去考虑。
1,两个或两个以上线程执行同一段代码;
2,多个线程使用的锁要是同一个锁;
你这个情况两个前提都不符合了。
你的主函数中应该要new出6个服务窗口对象,其中有4个是普通服务窗口吧;
所以是4个服务窗口对象各自启动一个线程执行自己的代码。4个对象在内存中占据4份内存。
是相互独立的,所以你上面加了同步的代码内存中有4份,每一份由各自的服务窗口对象的一个线程去执行。
你没有了第一个前提,第二个前提就毫无意义了,4个对象你内存中(type)一样有4份对应的是当然是4个不同的锁。
作者: 黄云南 时间: 2012-3-25 05:41
要解决这问题你的代码就要全部改了,其实如果实现你的要求就等于一个窗口在为一个客户服务,
另外几个窗口就得等着,等你服务完了其他窗口才能继续服务。这样显然不符合常理。如果只是
想知道开始服务和结束服务可以这样改;代码如下:
code]private void commonSever() {
Integer number = NumberMachine.getInstance().getCommonManager().fetchNumber();
System.out.println(windowId +"号"+type+"窗口正在获取服务任务!!!");
if(number!=null){
synchronized (type) {
System.out
.println("----------------------windowId + "号" + type + "窗口服务开始"---------------------------------");
long startTime = System.currentTimeMillis();
int maxRandom = Constants.MAX_SEVER_TIME
- Constants.MIN_SEVER_TIME;
int severTime = new Random().nextInt(maxRandom) + 1
+ Constants.MIN_SEVER_TIME;
try {
Thread.sleep(severTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long costTime = System.currentTimeMillis() -startTime;
System.out.println(windowId + "号" + type + "窗口为第" + number
+ "号普通客户服务耗时" + costTime / 1000 + "秒");
System.out
.println(---------------------windowId + "号" + type + "窗口服务结束"---------------------------------");
}
}else{
System.out.println(windowId +"号"+type+"窗口任务获取失败,休息1秒!!!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
[/code]
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |