多线程实战(一)——多线程轮流调用

本文探讨了如何使用多线程处理工单问题,要求线程按特定条件处理不同工单。通过Java的`synchronized`, `wait()`, `notify()`, `notifyAll()`以及JDK1.5的`Lock`和`Condition`实现线程间的协调。分析了可能导致死锁的原因,并提出了避免死锁的策略。" 112106232,10296701,提升Elasticsearch写入与集群性能的策略,"['Elasticsearch优化', '数据处理', '服务器优化', '索引管理', '性能调优']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

师傅留了一个作业让我们来熟悉多线程问题,原本对多线程一直处于理论阶段,大二学操作系统的时候写的也是一知半解,今天拿到这道题又好好的做了一遍。

题目:审核系统有一批工单需要处理,现在启动三个线程进行处理,要求线程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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值