多线程间的协调实战——多线程轮流处理

本文通过一个问题实例介绍了如何使用Java的多线程协作来实现任务的轮流处理。问题背景是一个审核系统,需要三个线程分别处理不同工单ID,确保工单按顺序处理。文章详细讲解了使用`synchronized`、`wait()`、`notify()`和`notifyAll()`,以及JDK 1.5并发包中的`Lock`和`Condition`来解决这个问题。作者分享了自己的学习过程,并给出了两种实现方案,同时提出了关于锁和条件对象的设计意图以及性能优化的思考。
摘要由CSDN通过智能技术生成

问题

    这个问题来自于我的同学超小手,详情如下:
    题目:审核系统有一批工单需要处理,现在启动三个线程进行处理,要求线程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;
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值