Lock和Condition实现多线程循环执行

我们可能有如下使用场景:
A、B、C三个线程,业务需要A执行5遍,然后B执行10遍,然后C执行15遍,如此循环

这时候我们可以考虑用到Lock的Condition机制

public class LockTest {

    private volatile int number = 1;

    private Lock lock = new ReentrantLock();

    private Condition c1 = lock.newCondition();
    private Condition c2 = lock.newCondition();
    private Condition c3 = lock.newCondition();

    public void print5() throws InterruptedException {

        lock.lock();

        while(number != 1) {
            c1.await();
        }
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName());
        }
        number = 2;
        c2.signal();

        lock.unlock();
    }

    public void print10() throws InterruptedException {

        lock.lock();

        while(number != 2) {
            c2.await();
        }
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName());
        }
        number = 3;
        c3.signal();
        lock.unlock();
    }

    public void print15() throws InterruptedException {

        lock.lock();

        while(number != 3) {
            c3.await();
        }
        for (int i = 0; i < 15; i++) {
            System.out.println(Thread.currentThread().getName());
        }
        number = 1;
        c1.signal();
        lock.unlock();
    }

    public static void main(String[] args) {
        LockTest lockTest = new LockTest();
        new Thread(()->{
            try {
                for (int i = 0; i < 10; i++) {
                    lockTest.print5();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"AAA").start();
        new Thread(()->{
            try {

                for (int i = 0; i < 10; i++) {
                    lockTest.print10();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"BBB").start();
        new Thread(()->{
            try {
                for (int i = 0; i < 10; i++) {
                    lockTest.print15();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"CCC").start();
    }

}
发布了328 篇原创文章 · 获赞 23 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/lbh199466/article/details/104450302