多线程循环打印ABC

condition 1

public class ConditionTest {
    
    private final Lock lock = new ReentrantLock();
    
    private final Condition conditionA = lock.newCondition();
    private final Condition conditionB = lock.newCondition();
    
    // 控制状态
    private int flag = 1;
    
    public static void main(String[] args) {
        
        ConditionTest conditionTest = new ConditionTest();
        
        Thread tA = new Thread(() -> {
            for (int i = 1; i <= 10; i++) {
                conditionTest.printA(i);
            }
        }, "A");
        tA.start();
        
        Thread tB = new Thread(() -> {
            for (int i = 1; i <= 10; i++) {
                conditionTest.printB(i);
            }
        }, "B");
        tB.start();
    }
    
    
    public void printA(int i) {
        lock.lock();
        try {
            if(flag != 1){
                conditionA.await();
            }
        }catch (Exception e){
        }
        flag = 2;
        conditionB.signal();
        System.out.println(Thread.currentThread().getName() + "---print---" + i);
        lock.unlock();
    }
    
    public void printB(int i) {
        lock.lock();
        try {
            if(flag != 2){
                conditionB.await();
            }
            flag = 1;
            conditionA.signal();
        }catch (Exception exception){
        }
        System.out.println(Thread.currentThread().getName() + "---print---" + i);
        lock.unlock();
    }
    
}

condition 2

public class ConditionTest {
    
    
    public final static Lock lock = new ReentrantLock();
    
    public final static Condition conditionA = lock.newCondition();
    public final static Condition conditionB = lock.newCondition();
    
    
    private int flag = 1;
    
    public static void main(String[] args) {
        
        ConditionTest conditionTest = new ConditionTest();
    
        new Thread(() -> {
            conditionTest.printABC(0, conditionA, conditionB);
        }, "A").start();
        new Thread(() -> {
            conditionTest.printABC(1, conditionB, conditionA);
        }, "B").start();
      
    }
    
    private void printABC(int targetNum, Condition currentThread, Condition nextThread) {
        for (int i = 0; i < 3; ) {
            lock.lock();
            try {
                while (flag % 2 != targetNum) {
                    currentThread.await();  //阻塞当前线程
                }
                flag++; // 调整线程信号量数据(阻塞和唤起)
                i++; // 当前线程内的循环数据累加
                System.out.print(Thread.currentThread().getName());
                nextThread.signal();    //唤醒下一个线程
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
    }
}

Lock

public class ConditionTest1 {
    
    private static final Lock lock = new ReentrantLock();//通过JDK5中的Lock锁来保证线程的访问的互斥
    
    private static int num = 1;
    
    public static void main(String[] args) {
        
        ConditionTest1 conditionTest1 = new ConditionTest1();
        
        Thread tA = new Thread(() -> {
            conditionTest1.printStr(0);
        }, "A");
        tA.start();
        
        Thread tB = new Thread(() -> {
            conditionTest1.printStr(1);
        }, "B");
        tB.start();
        
        Thread tc = new Thread(() -> {
            conditionTest1.printStr(2);
        }, "C");
        tc.start();
    }
    
    public void printStr(int targetNum) {
        for (int i = 0; i < 3; ) {
            lock.lock();
            if (num % 3 == targetNum) {
                num++;
                i++;
                System.out.println(Thread.currentThread().getName());
            }
            lock.unlock();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值