iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >ReentrantLock条件变量使多个线程顺序执行
  • 625
分享到

ReentrantLock条件变量使多个线程顺序执行

ReentrantLock多个线程顺序执行ReentrantLock条件变量 2022-12-19 12:12:55 625人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录一. 前言二. 解决方案三. 使用ReentrantLock 条件变量四. 后话一. 前言 近日一个学生在参加某公司校招面试时,遇到一个多个线程顺序执行的面试题,特意记录下来和大

一. 前言

近日一个学生在参加某公司校招面试时,遇到一个多个线程顺序执行的面试题,特意记录下来和大家分享一下,这个题目的具体要求是这样的:

假设有3个线程 a,b,c,要求三个线程一起进入到就绪态,执行时一定 要 按照 a-->b-->c的顺序执行 。即使 a或者b线程进入 到了 阻塞态,也一定 会 按照a-->b-->c的顺序运行线程 。请问该如何保证实现这个需求呢?

二. 解决方案

关于这道题,百度一下网上常见的实现思路,大致有4种解决方案:

通过join()方法使当前线程“阻塞”,等待指定线程执行完毕后继续执行;

通过倒数计时器CountDownLatch实现;

通过创建单一化线程池 newSingleThreadExecutor()实现;

通过ReentrantLock 中的条件变量实现;

今天壹哥先使用ReentrantLock 的条件变量来实现这个题目中的需求。

三. 使用ReentrantLock 条件变量

首先咱们来了解一下,什么是ReentrantLock 条件变量(Condition)。

ReentrantLock 中的条件变量功能,类似于普通 synchronized 的 wait、notify,我们可以使用Reentrantlock ,配合 Condition 对象上的 await()和 signal()或 signalAll()方法,来实现线程间协作。与synchronized的wait和notify不同之处在于,ReentrantLock中的条件变量可以有多个,可以实现更精细的控制线程。

Condition中常用的方法api有如下这些:

编辑

ReentrantLock代码实现:

class ShareDataLock{
    // 线程执行的条件 1:线程1执行 2:线程2执行 3:线程3执行
    int number =1;
    // 锁
    Lock lock = new ReentrantLock();
    // 从锁中获得3个条件变量
    Condition condition1 = lock.newCondition();
    Condition condition2 = lock.newCondition();
    Condition condition3 = lock.newCondition();

    // 第一个线程run之后执行的方法
    public void f1(){
        lock.lock();
        try {
            // 如果条件值不为1 就挂起等待
            while(number!=1){
                condition1.await();
            }
            // 故意阻塞100毫秒,看看其他的线程会不会不再排队
            Thread.sleep(100);
            System.out.println("------1--------");
            // 线程1 执行完毕 把变量设置为2
            number = 2;
            // 唤醒第2个条件变量
            condition2.signal();
        } catch (Exception e) {
          e.printStackTrace();
        } finally {
            // 不管抛没抛出异常都要解锁,防止线程死锁
          lock.unlock();
        }
    }
    
    public void f2(){
        lock.lock();
        try {
            while(number!=2){
                condition2.await();
            }
            System.out.println("------2--------");
            number = 3;
            condition3.signal();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
    
    public void f3(){
        lock.lock();
        try {
            while(number!=3){
                condition3.await();
            }
            System.out.println("------3--------");
            number = 1;
            condition1.signal();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
}


public class SynchronizedAndReentrantLockDemo {

    public static void main(String[] args) {
        ShareDataLock shareDataLock = new ShareDataLock();
        for (int i = 0; i < 10; i++) {
            // 3个线程分别执行1,2,3 3个方法 ,并且同时就绪
            new Thread(()->shareDataLock.f1(),"AA").start();
            new Thread(()->shareDataLock.f2(),"bb").start();
            new Thread(()->shareDataLock.f3(),"cc").start();
        }

    }
}

代码执行效果如下图:

现在我们就会发现,3个线程已经可以被随意控制了,你会了吗?

四. 后话

如上文所述,让多个线程按顺序执行,网上常见的解决方案有4种。但大家要注意的是,面试官出这个题有一个先决条件,“要让所有的线程同时就绪 ,所以我们就可以排除使用join方法和使用单一化线程池的方案了。那么要想实现这个面试题中的需求,比较靠谱的方法只剩下ReentrantLock 中的条件变量和使用倒数计时器CountDownLatch两种方案了

今天咱们暂时先介绍条件变量的方法,会在日后的文章中介绍怎样使用CountDownLatch 让多个线程有序执行.

以上就是ReentrantLock条件变量使多个线程顺序执行的详细内容,更多关于ReentrantLock多个线程顺序执行的资料请关注编程网其它相关文章!

--结束END--

本文标题: ReentrantLock条件变量使多个线程顺序执行

本文链接: https://www.lsjlt.com/news/175223.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • ReentrantLock条件变量使多个线程顺序执行
    目录一. 前言二. 解决方案三. 使用ReentrantLock 条件变量四. 后话一. 前言 近日一个学生在参加某公司校招面试时,遇到一个多个线程顺序执行的面试题,特意记录下来和大...
    99+
    2022-12-19
    ReentrantLock多个线程顺序执行 ReentrantLock条件变量
  • Java怎么让多线程按顺序执行
    本文小编为大家详细介绍“Java怎么让多线程按顺序执行”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java怎么让多线程按顺序执行”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在子线程中通过join()方法指定...
    99+
    2023-06-30
  • java如何实现多线程的顺序执行
    场景 编写一个程序,启动三个线程,三个线程的name分别是A,B,C;,每个线程将自己的ID值在屏幕上打印5遍,打印顺序是ABCABC... 使用 synchronized 实现 ...
    99+
    2024-04-02
  • java怎么实现多线程的顺序执行
    这篇文章主要介绍java怎么实现多线程的顺序执行,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!场景编写一个程序,启动三个线程,三个线程的name分别是A,B,C;,每个线程将自己的ID值在屏幕上打印5遍,打印顺序是A...
    99+
    2023-06-15
  • c++多线程要使用条件变量的原因
    小编给大家分享一下c++多线程要使用条件变量的原因,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!先看示例1:#include <iostream&...
    99+
    2023-06-15
  • Java让多线程按顺序执行的几种方法
    目录在子线程中通过join()方法指定顺序在主线程中通过join()方法指定顺序通过倒数计时器CountDownLatch实现通过创建单一化线程池newSingleThreadExe...
    99+
    2024-04-02
  • C++中多线程的执行顺序如你预期吗
    目录一个简单的例子诡异的输出结果你看到的执行顺序不是真的执行顺序你看到的执行顺序还不是真正的执行顺序C++多线程内存模型一个简单的例子 先来看一个多线程的例子: 如图所示,我们将变...
    99+
    2022-11-13
    C++多线程执行顺序 C++多线程
  • c++多线程为何要使用条件变量详解
    先看示例1: #include <iostream> #include <windows.h> #include <mutex> #inclu...
    99+
    2024-04-02
  • 三个线程顺序执行的实现方法是什么
    本篇内容主要讲解“三个线程顺序执行的实现方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“三个线程顺序执行的实现方法是什么”吧!先说下要求,就是三个线程,...
    99+
    2024-04-02
  • 怎么在java中利用多线程执行多个程序
    这期内容当中小编将会给大家带来有关怎么在java中利用多线程执行多个程序,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于...
    99+
    2023-06-14
  • 如何使用PHP多线程执行多个方法
    在PHP开发中,经常会遇到需要同时执行多个操作的情况。想要在一个进程中同时执行多个耗时操作,就需要使用PHP的多线程技术来实现。本文将介绍如何使用PHP多线程执行多个方法,提高程序的并发性能。一、PHP多线程概述传统的PHP是单线程的语言,...
    99+
    2023-05-14
    多线程 php
  • 怎么使用PHP多线程执行多个方法
    这篇文章主要介绍“怎么使用PHP多线程执行多个方法”,在日常操作中,相信很多人在怎么使用PHP多线程执行多个方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用PHP多线程执行多个方法”的疑惑有所帮助!...
    99+
    2023-07-05
  • C++多线程互斥锁和条件变量的详解
    目录互斥锁:std::mutex::try_lock         条件变量:condition_variable总结我们了解互斥...
    99+
    2024-04-02
  • springboot使用之多个filter的执行顺序以及配置方式
    springboot 多个filter的执行顺序以及配置 当项目中有多个filter时,为了便于管理,可以创建一个配置文件,对所有的filter进行管理。 有的方法可能同时需要多个f...
    99+
    2024-04-02
  • PHP 多线程环境中的函数执行顺序是如何处理的?
    在 php 多线程环境中,函数执行顺序取决于:php 本身:默认单线程,但可以通过启用多线程创建多个并行线程执行任务。服务器环境:如 apache 服务器,每个请求创建新进程包含 php...
    99+
    2024-04-17
    php 多线程 apache
  • 详解Spring 拦截器流程及多个拦截器的执行顺序
    目录拦截器的定义测试拦截器多个拦截器的执行顺序让 preHandle 进行拦截总结       拦截器是 Spring MVC 中的组件,它可...
    99+
    2024-04-02
  • 操作系统多线程:解锁程序并发执行的强大力量
    1. 多线程的基本概念 多线程是操作系统实现进程并发执行的一种重要机制,它允许进程在同一时间内同时执行多个任务,提高计算机的运行效率。多线程是在一个进程中创建多个执行流,这些执行流共享该进程的资源,并同时执行不同的任务。 2. 多线程的...
    99+
    2024-02-24
    多线程 并发执行 进程 线程同步 线程通信
  • MyBatis多个条件使用Map传递参数进行批量删除方式
    目录多个条件使用Map传递参数进行批量删除1、使用场景2、代码实现3、实现结果展现MyBatis 多条件批量删除的sql语句我把这次的代码贴出来,仅供参考多个条件使用Map传递参数进...
    99+
    2024-04-02
  • linux如何一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘
    ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作