A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 朱亚安 中级黑马   /  2012-3-25 01:47  /  1757 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

   按照老师的思路,我自己敲了一遍代码。但是运行的时候:

---------------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();
           }
       }
    }


而且我把里面的锁住了,为什么还会跳出去呢。这个我就弄不明白了。谁知道怎么来解决给个建议吧。。。。

3 个回复

倒序浏览
看你的代码开始还没有客户,所以还没有执行System.out.println(windowId + "号" + type + "窗口为第" + number

                     + "号普通客户服务耗时" + costTime / 1000 + "秒");当然也不会执行到System.out

                      .println("---------------end---------------------------------------------------");
等到客户出现并服务后才会有end输出。
回复 使用道具 举报
出现你这种情况用多线程同步的两个前提去考虑。
1,两个或两个以上线程执行同一段代码;
2,多个线程使用的锁要是同一个锁;
你这个情况两个前提都不符合了。
你的主函数中应该要new出6个服务窗口对象,其中有4个是普通服务窗口吧;
所以是4个服务窗口对象各自启动一个线程执行自己的代码。4个对象在内存中占据4份内存。
是相互独立的,所以你上面加了同步的代码内存中有4份,每一份由各自的服务窗口对象的一个线程去执行。
你没有了第一个前提,第二个前提就毫无意义了,4个对象你内存中(type)一样有4份对应的是当然是4个不同的锁。


回复 使用道具 举报
要解决这问题你的代码就要全部改了,其实如果实现你的要求就等于一个窗口在为一个客户服务,
另外几个窗口就得等着,等你服务完了其他窗口才能继续服务。这样显然不符合常理。如果只是
想知道开始服务和结束服务可以这样改;代码如下:
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]
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马