java 两个线程接力跑

假设有这样一个场景,有一个任务有100个步骤。希望用两个线程进行接力完成。也就是第一个步骤是线程1去做,做完了,通知线程2去做第二个任务;线程2做完第二个任务了,再通知线程1去做第三个任务。以此类推,直到完成全部的任务。

(没想到有什么实际场景需要这样做~)

实现思路是这样的:

  1. 首先让一个线程先去搞步骤1,搞完了,就阻塞,通知第二个线程
  2. 第二个线程接到通知就开始搞自己的,搞完了,通知对方,然后阻塞自己。
  3. 以此类推

代码上打算用 wait + notify 去实现。这里有一个前提就是 notify 是无害的,也就是可以无限次调用。

public class Client {

    public static final Class<Client> sLock = Client.class;

    public static void main(String[] args) throws InterruptedException {
        System.out.println("main...");
        synchronized (sLock) {
            // notify 无副作用,没有被阻塞的线程也可以随便调用!
            sLock.notify();
            sLock.notify();
        }
        Thread.sleep(10); // 保证上面的 notify 不影响到下面的逻辑
        one2();
    }

    private static void one2() {
        Client client = new Client();
        new Thread(() -> {
            reduce(client);
        }, "cat").start();

        new Thread(() -> {
            reduce(client);
        }, "BANANA").start();
    }

    private static void reduce(Client client) {
        try {
            synchronized (sLock) {
                while (client.rest > 0) {
                    sLock.notify();
                    client.rest--;
                    System.out.println(Thread.currentThread()
                            + " $ " + (client.rest + 1));
                    sLock.wait();
                }
                sLock.notify();
                System.out.println("notify ");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static final int SIZE = 100;

    private int rest = SIZE;

}

输出效果:

main...
Thread[cat,5,main] $ 100
Thread[BANANA,5,main] $ 99
。。。
Thread[BANANA,5,main] $ 7
Thread[cat,5,main] $ 6
Thread[BANANA,5,main] $ 5
Thread[cat,5,main] $ 4
Thread[BANANA,5,main] $ 3
Thread[cat,5,main] $ 2
Thread[BANANA,5,main] $ 1
notify 
notify 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值