假设有10个线程,如何让他们顺序执行?

2021-07-16  本文已影响0人  张云飞Vir

1. 背景

假设:有10个线程,如何让他们顺序执行?

解答:可以使用 多线程配合 "公平锁" 来实现。
涉及到 Thread, ReentrantLock

2.知识

公平锁就是保障了多线程下各线程获取锁的顺序,先到的线程优先获取锁,而非公平锁则无法提供这个保障。

某个线程尝试获取锁时,先会尝试 CAS ,失败后会把自己放入 这个是锁的等待队列,这时队列里多个等待锁的顺序如果是有序的,就是公平锁,如果无序则是非公平锁。

Java 中的 ReentrantLock 构造函数可以默认的锁策略是非公平锁。

ReentrantLock reentrantLock = new ReentrantLock(); // 默认 "不公平锁"
boolean isFair = true; // 是否 公平锁
ReentrantLock reentrantLock2 = new ReentrantLock(isFair); // 这个构造方法可以产出 "公平锁"

3. 示例

上代码:

public class Main {

    static class MyService {
        ReentrantLock reentrantLock = new ReentrantLock(true);

        void doSome() {
            reentrantLock.lock();
            System.out.println(String.format("\t\t\t\t 线程[%s] 执行 ...", Thread.currentThread().getName()));
            reentrantLock.unlock();
        }
    }

    public static void main(String[] args) {
        final MyService myService = new MyService();
        Runnable runnable = () -> {
            System.out.println(String.format("线程[%s] 进入 ...", Thread.currentThread().getName()));
            myService.doSome();
        };

        Thread[] threadArray = new Thread[10];
        for (int i = 0; i < 10; i++) {
            Thread thread = new Thread(runnable);
            thread.setName("Thread_" + i);
            threadArray[i] = thread;
        }

        Arrays.stream(threadArray).forEach(Thread::start);


        try {
            Thread.sleep(20 * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

输出的结果:

image.png

END

上一篇下一篇

猜你喜欢

热点阅读