三个线程循环交替执行

比如
A线程输出1,
B线程输出2,
C线程输出3,
A线程输出4,
B线程输出5,
C线程输出6
……

我们可以用synchronized和wait和notify来实现,要实现顺序执行,那么下一个线程的开始应该是上一个线程给的信号,这样才能保证顺序执行,代码如下

public static void main(String[] args) throws InterruptedException {
        Object lockA = new Object();
        Object lockB = new Object();
        Object lockC = new Object();
        ThreadA threadA = new ThreadA("ThreadA", lockC, lockA);
        ThreadB threadB = new ThreadB("ThreadB", lockA, lockB);
        ThreadC threadC = new ThreadC("ThreadC", lockB, lockC);
        threadA.start();
        Thread.sleep(10);
        threadB.start();
        Thread.sleep(10);
        threadC.start();
    }
public class ThreadA extends Thread {

    private Object lockC;
    private Object lockA;

    public ThreadA(String name, Object lockC, Object lockA) {
        super(name);
        this.lockC = lockC;
        this.lockA = lockA;
    }

    @Override
    public void run() {
        for (int i = 1; i <= 100; i += 3) {
            synchronized (lockC) {
                synchronized (lockA) {
                    System.out.println("A" + i);
                    lockA.notify();
                }
                try {
                    if(i != 100){
                        lockC.wait();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
public class ThreadB extends Thread {

    private Object lockA;
    private Object lockB;

    public ThreadB(String name, Object lockA, Object lockB) {
        super(name);
        this.lockA = lockA;
        this.lockB = lockB;
    }

    @Override
    public void run() {
        for (int i = 2; i <= 100; i += 3) {
            synchronized (lockA) {
                synchronized (lockB) {
                    System.out.println("B" + i);
                    lockB.notify();
                }
                try {
                    if(i != 98){
                        lockA.wait();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
public class ThreadC extends Thread {

    private Object lockB;
    private Object lockC;

    public ThreadC(String name, Object lockB, Object lockC) {
        super(name);
        this.lockB = lockB;
        this.lockC = lockC;
    }

    @Override
    public void run() {
        for (int i = 3; i <= 100; i += 3) {

            synchronized (lockB) {
                synchronized (lockC) {
                    System.out.println("C" + i);
                    lockC.notify();
                }
                try {
                    if(i != 99){
                        lockB.wait();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

测试输出结果:

A1
B2
C3
A4
B5
C6
A7
B8
C9
A10
B11
C12
A13
B14
C15
A16
B17
C18
A19
B20
C21
A22
B23
C24
A25
B26
C27
A28
B29
C30
A31
B32
C33
A34
B35
C36
A37
B38
C39
A40
B41
C42
A43
B44
C45
A46
B47
C48
A49
B50
C51
A52
B53
C54
A55
B56
C57
A58
B59
C60
A61
B62
C63
A64
B65
C66
A67
B68
C69
A70
B71
C72
A73
B74
C75
A76
B77
C78
A79
B80
C81
A82
B83
C84
A85
B86
C87
A88
B89
C90
A91
B92
C93
A94
B95
C96
A97
B98
C99
A100
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值