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()方法。多线程记录
最新推荐文章于 2025-06-01 09:47:25 发布
170

被折叠的 条评论
为什么被折叠?



