美文网首页
假设有10个线程,如何让他们顺序执行?

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

作者: 张云飞Vir | 来源:发表于2021-07-16 15:21 被阅读0次

    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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/kdrbpltx.html