师傅留了一个作业让我们来熟悉多线程问题,原本对多线程一直处于理论阶段,大二学操作系统的时候写的也是一知半解,今天拿到这道题又好好的做了一遍。
题目:审核系统有一批工单需要处理,现在启动三个线程进行处理,要求线程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等类的相关方法来实现。
对于第一个问题,网上有很多相关的代码,有重写三个run方法的,甚至有创建1000个进程的,很多都不是特别的好。受到一篇博文的启发@zyplus,我写出了下面的代码,优势之处在于传参的话只需要重写一个run方法,代码也相对优美一些。具体思想是这样的,其实我们要做的知识对3个线程的循环调用,为了控制三个线程的前后顺序,需要定义两个锁,一个是prev,即前一个线程持有的对象锁,第二个是self,用来使下一个线程进行等待和唤醒状态转换。
public class GongdanHandler extends Thread {
private String name;
private Object prev;
private Object self;
private static int id = 1;
private GongdanHandler(String name, Object prev, Object self) {
this.name = name;
this.prev = prev;
this.self = self;
}
public void run() {
while (id