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线程按序交替执行内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mybatis 自定义类型处理器示例详解

    Mybatis 自定义类型处理器示例详解

    在某些情况下我们需要对类型做处理,例如数据存储的是Long,程序里是BigDecimal,那么我们出库入库都需要做处理,此时就可以使用类型处理器,本文通过示例给大家介绍Mybatis 自定义类型处理器的相关知识,感兴趣的朋友跟随小编一起看看吧
    2023-10-10
  • Spring Boot中application配置文件的生效顺序及应用范围

    Spring Boot中application配置文件的生效顺序及应用范围

    Spring Boot的一个重要特性就是它的自动配置,这一特性在很大程度上依赖于名称为application的配置文件,本文将详细介绍在Spring Boot中,这些配置文件的加载顺序以及每份文件的应用范围,需要的朋友可以参考下
    2024-03-03
  • SpringBoot关于自定义注解实现接口幂等性方式

    SpringBoot关于自定义注解实现接口幂等性方式

    这篇文章主要介绍了SpringBoot关于自定义注解实现接口幂等性方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • java 如何从字符串里面提取时间

    java 如何从字符串里面提取时间

    这篇文章主要介绍了java实现从字符串里面提取时间的方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java创建student类详细代码例子

    Java创建student类详细代码例子

    这篇文章主要给大家介绍了关于Java创建student类的相关资料,学生类(Student)是一种面向对象的编程概念,其主要用于描述学生的属性和行为,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • 使用springboot不自动初始化数据库连接池

    使用springboot不自动初始化数据库连接池

    这篇文章主要介绍了使用springboot不自动初始化数据库连接池,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • java打包文件成zip、压缩文件及file.mkdir和mkdirs的区别详解

    java打包文件成zip、压缩文件及file.mkdir和mkdirs的区别详解

    这篇文章主要给大家介绍了关于java打包文件成zip、压缩文件及file.mkdir和mkdirs区别详解的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-12-12
  • java Collection集合接口的介绍和使用详解

    java Collection集合接口的介绍和使用详解

    这篇文章主要为大家介绍了java Collection集合接口的介绍和使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • 深入了解Java中的反射机制(reflect)

    深入了解Java中的反射机制(reflect)

    Java的反射机制允许我们对一个类的加载、实例化、调用方法、操作属性的时期改为在运行期进行,这大大提高了代码的灵活度,本文就来简单讲讲反射机制的具体使用方法吧
    2023-05-05
  • Java实现多个单张tif文件合并成一个多页tif文件

    Java实现多个单张tif文件合并成一个多页tif文件

    业务部门需要将多个单张的tiff文件,合并成一个多页的tiff文件,本文就来介绍一下如何实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09

最新评论