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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 仵先进 中级黑马   /  2012-2-22 23:41  /  1997 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

业务要求 :12个银行窗口,140个等待的顾客,输入每个顾客相应的等待时间后,输出每个窗口相应的服务的顾客号。
我先是设了3个线程,表示三个窗口,一开始3个窗口都可以顺利运行。但是后来不知道怎么只有一个线程运行了,看了代码N遍也不知道哪里错了,求指教
public class mianThread extends Thread{
       
        private static int count=0;//这是静态变量
          private static boolean flag = true;   //信号量,用于线程间的互斥
          //这个run()方法被synchronized所控制
          int data[]={3,2,3,5,2,6,3,3,2};//表示每个顾客相应的服务时间
          public  synchronized void run(){
             
             while(count<=8){
               if (!flag)
                 try{
                    wait();
                 }catch (InterruptedException e) { }
               flag = false;
               int time=data[count];
               count = count+1;
               System.out.println("第"+getName()+"个窗口处理了第"+count+"个顾客,花费"+time+"分钟");
               flag = true;
               notifyAll();
               try{
                 sleep(time);//暂停相应的服务时间
               }catch (InterruptedException e) { }
            }
          }
          public mianThread(String name){
            super(name);
          }
               

}

下面是主函数
public class main {

        /**
         * @param args
         */
        public static void main(String[] args) {
        mianThread m1=new mianThread("first Thread");
        mianThread m2=new mianThread("second Thread");
        mianThread m3=new mianThread("Third Thread");
        m1.start();
        m2.start();
        m3.start();
        }

}

只有first thread这个进程运行  这是什么情况。。。。。。。:Q

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

4 个回复

倒序浏览
public  synchronized void run(){
  这句你试试把synchronized去掉,应该是这里的问题。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
问题恐怕不是上面的描述,你的run方法里只有while代码块,那么只要条件符合就会一直运行,但是你的测试程序设计了 3个线程,那么就有一个疑问,你的同步原先是对什么资源设置的   ?

你的程序刚开始3个线程都运行,后来只有一个线程运行的原因是你的线程的睡眠时间很短,最长的也只有  6 毫秒, 所以很容易出现一个线程搞定所以顾客的情况  。

这是我的一些代码:http://tanlei200620.blog.163.com/blog/static/203045198201211310573576/   

评分

参与人数 1技术分 +1 收起 理由
荣凯旋 + 1

查看全部评分

回复 使用道具 举报
多线程处理同一个资源最好还是用Runnable接口吧
while循环中去掉flag=true;和flag=false;就可以了,但运行结果会产生不同的线程处理同一个顾客的现象。  
回复 使用道具 举报
还是说些心得吧,刚开始的时候我也是很郁闷于张老师的银行系统,甚至有改写一些东西的想法,把这个定义为一个排队机制,但是这时候我很纳闷是不是定义了一个算法,是不是成了面向过程的思考问题,至少觉得面向对象应该不需要这样的算法来进行调节,应该是各个对象自己通过消息或着对对象状态的判断来自我执行。

所以楼主的同步应该是一个银行窗口的各个方法的同步,每个顾客对应的资源的同步,楼主的改进  应该是在 run方法中对  同步方法的调用,而那个信号量是用来决定阻塞的,(也可以理解为其它对象传递的消息,只不过这个消息是银行窗口主动获得的),银行窗口自身也需要有信号量。

评分

参与人数 1技术分 +1 收起 理由
荣凯旋 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马