前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >假设有10个线程,如何让他们顺序执行?

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

作者头像
张云飞Vir
发布2021-07-19 16:12:48
6990
发布2021-07-19 16:12:48
举报
文章被收录于专栏:写代码和思考写代码和思考

1. 背景

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

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

2.知识

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

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

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

代码语言:javascript
复制
ReentrantLock reentrantLock = new ReentrantLock(); // 默认 "不公平锁"
boolean isFair = true; // 是否 公平锁
ReentrantLock reentrantLock2 = new ReentrantLock(isFair); // 这个构造方法可以产出 "公平锁"

3. 示例

上代码:

代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 背景
  • 2.知识
  • 3. 示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档