多线程记录

Thread的run方法你为何用synchronized 装饰?synchronized 同步方法的互斥只发生在多个线程调用同个对象的方法时,在这里每个线程的run方法都是由主线程开启,何来多个线程调用run?
另外 在线程内部调用wait();和notifyAll,相当于调用self.wait和self.notifyAll,这两个方法的同步是通过同一个对象来进行互斥的,那么各自线程各自利用自身进行互斥,线程之间并没有任何交集的地方,怎么实现会实现交互?举个简单的例子,线程t1调用wait()进入了自身的等待区,它现在不能再往下跑了,现在等的是别的线程来调用t1.notifyAll来激活,但是线程t2和t3都不知道t1这个东西,怎么来激活呢?甚至可能t2和t3都自己进入了自身对象的等待区而自身难保了.. 这样谁都救不了谁~~ 
     140个客户,每个客户需要办理的时间分别是确定的,一共有12个窗口可以办理客户,每个窗口处理完之后紧接着处理下一个客户(每个窗口的运作时间都不会影响到其他窗口的运作),直到全部处理完是吧。那么这就是一个生产者&消费者的问题了,这里的生产者就是客户和他的时间,而且还是固定的量,消费者就是窗口,我们抽象为一个个的线程,于是:
     抽象一个Routine类表示事务,里面描述了用户名称和用户需要办理的时间:
     class Routine{
     String name;
     long orderTime;
     int custNumber; // 描述当前客户的序号
     }
    抽象一个Routine的Provider类,用于向窗口提供事务,需要考虑同步:
     class RoutineProvider{
      private List<Routine> routines = new LinkedList<Routine>();
       public void init(){
       //在这里做初始化,为routines 添加140个实例,count置为140
      }
     //声明fetchRoutine,用于向窗口线程提供一个Routine,需要注意的是,这里需要同步
     public synchronized Routine fetchRoutine(){
         if(routines.isEmpty())return null;
         return  routines.removeFirst();
      }
   }
   此后是窗口线程类:
   class WorkThread extends Thread{
    private RoutineProvider provider;
    private String name;
    public WorkThread(String name, RoutineProvider provider){
        this.name = name;
         this.provider = provider;
      }
    public void run(){
       while(true){
         Routine r = provider.fetchRoutine()
         if(r == null)break;   //事务全部被窗口线程拿走了
         System.out.println("窗口[" + name + "]正在处理第" + r.getCustNumber() + "个顾客(" + r.getName() + ")");
        try{
         sleep(r.getOrderTime())
          }catch(InterrupttedException e){}
    }
} 
   最后的处理简单了:
   1  新建一个RoutineProvider,为它初始化Routine列表
   2  创建一系列的窗口线程(WorkThread),在构造函数中指定窗口名、还有Provider(全局唯一)
   3 逐个调用线程的start()方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值