使用condition 实现线程顺序执行
书上给的例子都是ABCABC这种,比较简单,复杂点的如A0B0C0, A0A1A2没有,手动实现下,做个记录
1. A0 A1 A2 A3
public class Demo0 {
private static volatile int nextPrintWho = 0;
public static void main(String[] args) throws InterruptedException, NoSuchFieldException {
ReentrantLock lock = new ReentrantLock();
Condition condition = lock.newCondition();
Runnable runnable = ()-> {
lock.lock();
String name = Thread.currentThread().getName();
final int index = Integer.parseInt(name.substring(name.length() - 1, name.length()));
while (Demo0.nextPrintWho != index) {
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Demo0.nextPrintWho += 1;
println(Thread.currentThread().getName());
try {
condition.signAll();
}catch (Exception e) {
e.printStackTrace();
}finally {
if(lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
};
int size = 5;
List<Thread> threadList = new ArrayList<>(size);
for(int i=0; i<size; i++) {
threadList.add(new Thread(runnable,"A" + i));
}
threadList.forEach(i->i.start());
}
private static void println(Object object) {
System.out.println(object);
}
}
2.单condition实现ABC ABC ABC
/**
* @author tele
* @Description 使用condition实现顺序启动线程 ABC ABC ABC
* @create 2019-12-24
*/
public class Demo1 { private static volatile int nextPrintWho = 1; public static void main(String[] args) throws InterruptedException, NoSuchFieldException {
ReentrantLock lock = new ReentrantLock();
Condition condition = lock.newCondition(); Runnable runnableA = ()-> {
lock.lock();
while (Demo1.nextPrintWho != 1) {
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Demo1.nextPrintWho = 2;
println(Thread.currentThread().getName());
try {
condition.signAll();
}catch (Exception e) {
e.printStackTrace();
}finally {
if(lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}; Runnable runnableB = ()-> {
lock.lock();
while (Demo1.nextPrintWho != 2) {
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Demo1.nextPrintWho = 3;
println(Thread.currentThread().getName());
try {
condition.signal();
}catch (Exception e) {
e.printStackTrace();
}finally {
if(lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}; Runnable runnableC = ()-> {
lock.lock();
while (Demo1.nextPrintWho != 3) {
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Demo1.nextPrintWho = 1;
println(Thread.currentThread().getName());
try {
condition.signal();
}catch (Exception e) {
e.printStackTrace();
}finally {
if(lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}; for(int i=0; i<5; i++) {
new Thread(runnableA,"A").start();
new Thread(runnableB,"B").start();
new Thread(runnableC,"C").start();
} } private static void println(Object object) {
System.out.println(object);
} }
3.多个condition实现ABC ABC
/**
* @author tele
* @Description 使用多个condition实现顺序启动线程 ABC ABC ABC
* @create 2019-12-24
*/
public class Demo2 { private static volatile int nextPrintWho = 1; public static void main(String[] args) throws InterruptedException, NoSuchFieldException {
ReentrantLock lock = new ReentrantLock();
Condition conditionA = lock.newCondition();
Condition conditionB = lock.newCondition();
Condition conditionC = lock.newCondition(); Runnable runnableA = ()-> {
lock.lock();
while (Demo2.nextPrintWho != 1) {
try {
conditionA.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Demo2.nextPrintWho = 2;
println(Thread.currentThread().getName());
try {
conditionB.signal();
}catch (Exception e) {
e.printStackTrace();
}finally {
if(lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}; Runnable runnableB = ()-> {
lock.lock();
while (Demo2.nextPrintWho != 2) {
try {
conditionB.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Demo2.nextPrintWho = 3;
println(Thread.currentThread().getName());
try {
conditionC.signal();
}catch (Exception e) {
e.printStackTrace();
}finally {
if(lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}; Runnable runnableC = ()-> {
lock.lock();
while (Demo2.nextPrintWho != 3) {
try {
conditionC.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Demo2.nextPrintWho = 1;
println(Thread.currentThread().getName());
try {
conditionA.signal();
}catch (Exception e) {
e.printStackTrace();
}finally {
if(lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}; for(int i=0; i<5; i++) {
new Thread(runnableA,"A").start();
new Thread(runnableB,"B").start();
new Thread(runnableC,"C").start();
} } private static void println(Object object) {
System.out.println(object);
} }
4.A0 B0 C0 A1 B1 C1 A2 B2 C2
/**
* @author tele
* @Description 使用condition实现顺序启动线程 A0 B0 C0 A1 B1 C1 A2 B2 C2
* @create 2019-12-24
*/
public class Demo3 { private static volatile int nextPrintWho = 0; private static volatile int order = 1; private static final int ORDER_A = 1; private static final int ORDER_B = 2; private static final int ORDER_C = 3; public static void main(String[] args) throws InterruptedException, NoSuchFieldException {
ReentrantLock lock = new ReentrantLock();
Condition conditionA = lock.newCondition();
Condition conditionB = lock.newCondition();
Condition conditionC = lock.newCondition(); Runnable runnableA = ()-> {
lock.lock();
String name = Thread.currentThread().getName(); final int index = Integer.parseInt(name.substring(name.length() - 1, name.length())); while (!name.contains("A") || Demo3.nextPrintWho != index || Demo3.order != Demo3.ORDER_A) {
try {
conditionA.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
} Demo3.order = Demo3.ORDER_B;
println(Thread.currentThread().getName());
try {
conditionB.signalAll();
}catch (Exception e) {
e.printStackTrace();
}finally {
if(lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}; Runnable runnableB = ()-> {
lock.lock();
String name = Thread.currentThread().getName(); final int index = Integer.parseInt(name.substring(name.length() - 1, name.length())); while (!name.contains("B") || Demo3.nextPrintWho != index || Demo3.order != Demo3.ORDER_B) {
try {
conditionB.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Demo3.order = Demo3.ORDER_C;
println(Thread.currentThread().getName());
try {
conditionC.signalAll();
}catch (Exception e) {
e.printStackTrace();
}finally {
if(lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}; Runnable runnableC = ()-> {
lock.lock();
String name = Thread.currentThread().getName();
final int index = Integer.parseInt(name.substring(name.length() - 1, name.length()));
while (!name.contains("C") || Demo3.nextPrintWho != index || Demo3.order != Demo3.ORDER_C) {
try {
conditionC.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Demo3.nextPrintWho += 1;
Demo3.order = Demo3.ORDER_A;
println(Thread.currentThread().getName());
try {
conditionA.signalAll();
}catch (Exception e) {
e.printStackTrace();
}finally {
if(lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}; for(int i=0; i<5; i++) {
new Thread(runnableA,"A" + i).start();
new Thread(runnableB,"B" + i).start();
new Thread(runnableC,"C" + i).start();
} } private static void println(Object object) {
System.out.println(object);
} }
5.A0 A1 A2 A3 B0 B1 B2 B3
/**
* @author tele
* @Description 使用condition实现顺序启动线程 A0 A1 A2 A3 B0 B1 B2 B3
* @create 2019-12-24
*/
public class Demo4 { private static volatile int nextPrintWho = 0; private static volatile int order = 1; private static final int LIST_SIZE = 5; private static final int ORDER_A = 1; private static final int ORDER_B = 2; private static final int ORDER_C = 3; public static void main(String[] args) throws InterruptedException, NoSuchFieldException {
ReentrantLock lock = new ReentrantLock();
Condition condition = lock.newCondition();
Runnable runnableA = ()-> {
lock.lock();
String name = Thread.currentThread().getName(); final int index = Integer.parseInt(name.substring(name.length() - 1, name.length())); while (!name.contains("A") || Demo4.nextPrintWho != index || Demo4.order != Demo4.ORDER_A) {
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Demo4.nextPrintWho += 1;
if(Demo4.nextPrintWho == LIST_SIZE) {
Demo4.order = Demo4.ORDER_B;
Demo4.nextPrintWho = 0;
}
println(Thread.currentThread().getName());
try {
condition.signalAll();
}catch (Exception e) {
e.printStackTrace();
}finally {
if(lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}; Runnable runnableB = ()-> {
lock.lock();
String name = Thread.currentThread().getName(); final int index = Integer.parseInt(name.substring(name.length() - 1, name.length())); while (!name.contains("B") || Demo4.nextPrintWho != index || Demo4.order != Demo4.ORDER_B) {
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Demo4.nextPrintWho += 1;
if(Demo4.nextPrintWho == LIST_SIZE) {
Demo4.order = Demo4.ORDER_C;
Demo4.nextPrintWho = 0;
}
println(Thread.currentThread().getName());
try {
condition.signalAll();
}catch (Exception e) {
e.printStackTrace();
}finally {
if(lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}; Runnable runnableC = ()-> {
lock.lock();
String name = Thread.currentThread().getName();
final int index = Integer.parseInt(name.substring(name.length() - 1, name.length()));
while (!name.contains("C") || Demo4.nextPrintWho != index || Demo4.order != Demo4.ORDER_C) {
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Demo4.order = Demo4.ORDER_C;
Demo4.nextPrintWho += 1;
println(Thread.currentThread().getName());
try {
condition.signalAll();
}catch (Exception e) {
e.printStackTrace();
}finally {
if(lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}; List<Thread> threadAList = new ArrayList<>(LIST_SIZE);
List<Thread> threadBList = new ArrayList<>(LIST_SIZE);
List<Thread> threadCList = new ArrayList<>(LIST_SIZE); for(int i=0; i<LIST_SIZE; i++) {
threadAList.add(new Thread(runnableA,"A" + i));
threadBList.add(new Thread(runnableB,"B" + i));
threadCList.add(new Thread(runnableC,"C" + i));
} threadAList.forEach(i->i.start());
threadBList.forEach(i->i.start());
threadCList.forEach(i->i.start()); } private static void println(Object object) {
System.out.println(object);
} }
使用condition 实现线程顺序执行的更多相关文章
- Java中如何保证线程顺序执行
只要了解过多线程,我们就知道线程开始的顺序跟执行的顺序是不一样的.如果只是创建三个线程然后执行,最后的执行顺序是不可预期的.这是因为在创建完线程之后,线程执行的开始时间取决于CPU何时分配时间片,线程 ...
- Android中让多个线程顺序执行探究
线程调度是指按照特定机制为多个线程分配CPU的使用权. 有两种调度模型:分时调度模型和抢占式调度模型. 分时调度模型:是指让所有的线程轮流获得cpu的使用权,并且平均分配每个线程占用的CPU的时间片. ...
- T1,T2,T3 三个线程顺序执行
T1,T2,T3 三个线程顺序执行 现在有 T1.T2.T3 三个线程,你怎样保证 T2 在 T1 执行完后执行,T3 在 T2 执行完后执行?(T1->T2->T3) 这个线程问题通常会 ...
- c#线程顺序执行
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...
- Java中线程顺序执行
现有线程threadone.threadtwo和threadthree,想要的运行顺序为threadone->threadtwo->threadthree,应该如何处理?这里需要用到一个简 ...
- 三个线程T1,T2,T3.保证顺序执行的三种方法
经常看见面试题:有三个线程T1,T2,T3,有什么方法可以确保它们按顺序执行.今天手写测试了一下,下面贴出目前想到的3种实现方式 说明:这里在线程中我都用到了sleep方法,目的是更容易发现问题.之前 ...
- 三个线程abc顺序执行
1.使用synchronized悲观锁(秋招阿里的一个笔试题,应该写的比较复杂,然后就没有然后了o(╥﹏╥)o) public class ThreadThreadp { private int fl ...
- C#之使用AutoResetEvent实现线程的顺序执行
前几天一朋友问我如何实现线程的顺序执行,说真的,虽然看过CLR这本书,也把线程部分拜读了两遍,但是这个问题出来之后还是没有一个思路.今天在搜索资料的时候无意中再次看到AutoResetEvent这个东 ...
- Qt 控制线程的顺序执行(使用QWaitCondition,并且线程类的run函数里记得加exec(),使得线程常驻)
背景项目中用到多线程,对线程的执行顺序有要求: A.一个线程先收数据 B.一个线程处理数据 C.一个线程再将处理后的数据发送出去 要求三个线程按照ABC的顺序循环执行. 思路子类化多线程方法 重写子类 ...
随机推荐
- 洛谷 P1829 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演)
题意:求$\sum_{i=1}^{n}\sum_{j=1}^{m}lcm(i,j)$. 开始开心(自闭)化简: $\sum_{i=1}^{n}\sum_{j=1}^{m}lcm(i,j)$ =$\su ...
- 笔记:less的三种使用方法
直接在浏览器端使用 第一步,引入 .less 文件(注意要将 rel 属性设置为“stylesheet/less”) <link rel="stylesheet/less" ...
- FinalShell for Mac
Mac一键安装脚本 curl -o finalshell_install.sh www.hostbuf.com/downloads/finalshell_install.sh;chmod +x fin ...
- 2019-8-31-C#-通过-probing-指定-dll-寻找文件夹
title author date CreateTime categories C# 通过 probing 指定 dll 寻找文件夹 lindexi 2019-08-31 16:55:58 +0800 ...
- Pytorch使用tensorboardX可视化。超详细!!!
tensorboard --logdir runs 改为 tensorboard --logdir=D:\model\tensorboard\runs 重点 在网上看了很多方法后发现将原本链接中的计算 ...
- ansible api 通过python 方式调用
pip3 install ansible Linux下面安装 Windows 安装没成功 from ansible.parsing.dataloader import DataLoader #读取ya ...
- cesium 基础
scaleByDistance : new Cesium.NearFarScalar(1.5e2, 1.5, 8.0e6, 0.0),--(近值,近端放大率,远值,远端放大率) 给定距离视点的近值和远 ...
- autocomplete="off" inpu属性
input 的属性autocomplete 默认为on 其含义代表是否让浏览器自动记录之前输入的值 很多时候,需要对客户的资料进行保密,防止浏览器软件或者恶意插件获取到 可以在input中加入auto ...
- 2019-9-2-win10-uwp-应用转后台清理内存
title author date CreateTime categories win10 uwp 应用转后台清理内存 lindexi 2019-09-02 12:57:38 +0800 2018-2 ...
- typescript基础语法--变量/函数/指令/类
博客地址 :https://www.cnblogs.com/sandraryan/ 要把ts文件引入到html中,首先要转码为js文件. 步骤: 终端运行: npm i -g typescript t ...