Java实现线程按序交替执行的方法详解

 更新时间:2022年10月08日 10:57:02   作者:小虚竹and掘金  
这篇文章主要为大家详细介绍了Java如何实现线程按序交替执行,文中的示例代码讲解详细,对我们了解线程有一定帮助,需要的可以参考一下

一、题目描述

题目:有a、b、c三个线程,使得它们按照abc依次执行10次。

二、解题思路

控制执行线程变量flag,利用lock锁来保证线程安全,使用comdition来堵塞线程和通信。

Condition:

condition接口描述了可能会与锁有关的条件变量。这些用法上与使用object.wait访问隐式监视器类似,但提供了更强大的功能。需要特别指出的是,单个lock可能与多个Condition对象关联。为了避免兼容性问题,Condition方法的名称与对应的objec版本中的不同。

在condition对象中:

  • await方法//是等待;这时锁会释放
  • signalAll方法//通知,线程等待结束,往下执行

Condition实例实质上被绑定到一个锁上。要为特定Lock实例获得Condition实例,请使用其newCondition()方法。

创建一个类:AbcAlternateDemo1

创建一个内部类:Alternate

内部类定义一个属性:线程启动的顺序标识flag

写三个方法:

  • loopA():先上锁,判断flag是不是1,不是则等待conditionA.await(); 如果是则输出,flag是2,通知线程往下执行conditionA.signalAll()。
  • loopB():先上锁,判断flag是不是2,不是则等待conditionA.await(); 如果是则输出,flag是3,通知线程往下执行conditionA.signalAll()。
  • loopC():先上锁,判断flag是不是3,不是则等待conditionA.await(); 如果是则输出,flag是1,通知线程往下执行conditionA.signalAll()。

三、代码详解

AbcAlternateDemo1

package com.xiaoxuzhu;

/**
 * Description: 
 *
 * @author xiaoxuzhu
 * @version 1.0
 *
 * <pre>
 * 修改记录:
 * 修改后版本	        修改人		修改日期			修改内容
 * 2022/5/15.1	    xiaoxuzhu		2022/5/15		    Create
 * </pre>
 * @date 2022/5/15
 */
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Description: 
 *
 * @author xiaoxuzhu
 * @version 1.0
 *
 * <pre>
 * 修改记录:
 * 修改后版本	        修改人		修改日期			修改内容
 * 2022/5/15.1	    xiaoxuzhu		2022/5/15		    Create
 * </pre>
 * @date 2022/5/15
 */
public class AbcAlternateDemo1 {

    public static void main(String[] args) {
        Alternate alternate = new Alternate();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    alternate.loopA(i);
                }
            }
        },"A").start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    alternate.loopB(i);
                }
            }
        },"B").start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    alternate.loopC(i);
                }
            }
        },"C").start();
    }

    static class Alternate{

        /**
         * //线程启动的顺序标识
         **/
        private int flag = 1;

        private Lock lock = new ReentrantLock();

        private Condition conditionA = lock.newCondition();
        private Condition conditionB = lock.newCondition();
        private Condition conditionC = lock.newCondition();

        public void loopA(int loopNum){
            lock.lock();
            try {
                if(flag !=1){
                    conditionA.await();
                }
                for (int i = 1; i <= 1; i++) {
                    System.out.println(Thread.currentThread().getName()+":"+"--"+loopNum+"--"+ i);
                }
                flag =2;
                conditionB.signalAll();
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        }

        public void loopB(int loopNum){
            lock.lock();
            try {
                if(flag !=2){
                    conditionB.await();
                }
                for (int i = 1; i <= 1; i++) {
                    System.out.println(Thread.currentThread().getName()+":"+"--"+loopNum+"--"+ i);
                }
                flag =3;
                conditionC.signalAll();
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        }

        public void loopC(int loopNum){
            lock.lock();
            try {
                if(flag !=3){
                    conditionC.await();
                }
                for (int i = 1; i <= 1; i++) {
                    System.out.println(Thread.currentThread().getName()+":"+"--"+loopNum+"--"+ i);
                }
                flag =1;
                System.out.println("----------------------");
                conditionA.signalAll();
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        }

    }
}

到此这篇关于Java实现线程按序交替执行的方法详解的文章就介绍到这了,更多相关Java线程按序交替执行内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringMVC RESTFul实战案例删除功能实现

    SpringMVC RESTFul实战案例删除功能实现

    这篇文章主要为大家介绍了SpringMVC RESTFul实战案例删除功能实现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • spring中的注入list集合

    spring中的注入list集合

    这篇文章主要介绍了spring中的注入list集合问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Springboot实现验证码登录

    Springboot实现验证码登录

    这篇文章主要为大家详细介绍了Springboot实现验证码登录,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • SpringBoot3集成Thymeleaf的过程详解

    SpringBoot3集成Thymeleaf的过程详解

    在现代的Web开发中,构建灵活、动态的用户界面是至关重要的,Spring Boot和Thymeleaf的结合为开发者提供了一种简单而强大的方式来创建动态的Web应用,本文将介绍如何在Spring Boot项目中集成Thymeleaf,并展示一些基本的使用方法,需要的朋友可以参考下
    2024-01-01
  • idea快捷键生成getter和setter,有构造参数,无构造参数,重写toString方式

    idea快捷键生成getter和setter,有构造参数,无构造参数,重写toString方式

    这篇文章主要介绍了java之idea快捷键生成getter和setter,有构造参数,无构造参数,重写toString方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Java线程变量ThreadLocal源码分析

    Java线程变量ThreadLocal源码分析

    ThreadLocal用来提供线程内部的局部变量,不同的线程之间不会相互干扰,这种变量在多线程环境下访问时能保证各个线程的变量相对独立于其他线程内的变量,在线程的生命周期内起作用,可以减少同一个线程内多个函数或组件之间一些公共变量传递的复杂度
    2022-08-08
  • RabbitMQ的基础知识

    RabbitMQ的基础知识

    本文详细介绍了RabbitMQ的基础知识,通过本文,我们可以了解到MQ工作原理、交换机等相关知识,有需要的朋友可以参考一下
    2021-08-08
  • springboot结合mysql主从来实现读写分离的方法示例

    springboot结合mysql主从来实现读写分离的方法示例

    这篇文章主要介绍了springboot结合mysql主从来实现读写分离的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • springboot vue测试平台开发调通前后端环境实现登录

    springboot vue测试平台开发调通前后端环境实现登录

    这篇文章主要介绍了springboot vue测试平台开发调通前后端环境实现登录详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • java实现实时通信聊天程序

    java实现实时通信聊天程序

    这篇文章主要为大家详细介绍了java实现实时通信聊天程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06

最新评论