问题
这个问题来自于我的同学超小手,详情如下:
题目:审核系统有一批工单需要处理,现在启动三个线程进行处理,要求线程1处理工单id mod 3 = 1的工单,线程2处理工单id mod 3 = 2的工单,线程3处理工单id mod 3 = 0的工单,直到工单全部处理完毕,假设工单有1000个,工单编号从1-1000,工单处理过程简化为打印工单id,要求工单必须按顺序处理,即打印结果必须保证从1-1000从小到大递增。
1. 请使用原始synchronized,wait(),notify(),notifyAll()等方式来实现。
2. 使用JDK1.5并发包提供的Lock,Condition等类的相关方法来实现。
学习过程
多线程这一块我是基本不会的,于是打开宝书TIJ从头看起,看了一个周末的多线程,无聊到炸,我也看会了。
开玩笑的,其实没完全弄懂,马马虎虎。这个问题呢,很明显是多线程间协作的问题。那么,翻开TIJ里线程协作那章,有个例子,给车上蜡,例子里四个类:车、上蜡线程、抛光线程、主线程(main),那个例子是说你必须上完蜡才能抛光、抛完光才能再上蜡(我不知道谁这么无聊),然后所有技术细节我在这里就不讲了,因为TIJ里讲的比我好多了。
解决方案
看完那个例子,这题就不难了,大同小异。我觉得书里的这种处理多线程的思想特别值得借鉴:一个被处理的资源、多个处理它的线程,并且资源的状态保存在资源里。解释一下,资源状态保存在资源里,是说打蜡那个例子里,车有没有打蜡被作为了一个属性存在于Car类中。那么这道题里,我们可以这么看:一摞待处理的工单、多个处理它的工人,单子处理到哪了保存为这摞单子的一个状态。
于是乎,仿照着书上的例子,自然而然写出下面的代码,我就不多做解释了,都在注释里:
package test1;
/**
* 这个类其实代表待处理的一摞子工单
*/
class DaiShenGongDan {
//允许参与处理的工作者数量
public int workerCount;
//当前正要处理的工单编号
public int curDanId = 1;
//最大工单编号
public int maxDanId;
public DaiShenGongDan(int maxDanId, int workerCount) {
this.maxDanId = maxDanId;