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线程按序交替执行内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringBoot如何使用TestEntityManager进行JPA集成测试
TestEntityManager是Spring Framework提供的一个测试框架,它可以帮助我们进行 JPA 集成测试,在本文中,我们将介绍如何使用 TestEntityManager 进行 JPA 集成测试,感兴趣的跟着小编一起来学习吧2023-06-06mybatisplus where QueryWrapper加括号嵌套查询方式
这篇文章主要介绍了mybatisplus where QueryWrapper加括号嵌套查询方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。2022-01-01Java Scala泛型(泛型方法,泛型类,泛型特质,上下界,协变、逆变、非变)
泛型的意思是泛指某种具体的数据类型, 在Scala中, 泛型用[数据类型]表示. 在实际开发中, 泛型一般是结合数组或者集合来使用的,这篇文章主要介绍了Scala泛型(泛型方法,泛型类,泛型特质,上下界,协变、逆变、非变),需要的朋友可以参考下2023-04-04彻底搞懂java并发ThreadPoolExecutor使用
这篇文章主要为大家介绍了彻底搞懂java并发ThreadPoolExecutor使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-02-02
最新评论