使用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的顺序循环执行. 思路子类化多线程方法 重写子类 ...
随机推荐
- BKDRHash算法的初步了解
字符串hash最高效的算法, 搜了一下, 原理是: 字符串的字符集只有128个字符,所以把一个字符串当成128或更高进制的数字来看,当然是唯一的 这里unsigned不需要考虑溢出的问题, 不过 ...
- 【Leetcode链表】分隔链表(86)
题目 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前. 你应当保留两个分区中每个节点的初始相对位置. 示例: 输入: head = 1->4 ...
- 2019-8-29-dotnet-core-使用-sqlite-部署到-Centos-服务器
title author date CreateTime categories dotnet core 使用 sqlite 部署到 Centos 服务器 lindexi 2019-08-29 19:1 ...
- SDUT-2138_判断可达性
数据结构实验之图论三:判断可达性 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 在古老的魔兽传说中,有两个军团,一个叫 ...
- Ubuntu 如何编译安装第三方库
在工程应用中都会用到第三方库,标准库是在我们安装IDE环境或系统自带已经编译好的库,我们是可以直接调用的,而第三方库需要我们自己下载,编译和安装后才能使用,这里我们说的是Ubuntu如何使用cmake ...
- LeetcCode102 Binary Tree Level Order Traversal
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...
- oracle获取中文出现乱码问题解决
首先搞清楚字符集和字符编码概念,了解oracle字符集原理,请参考一位大神的讲解: ref:http://blog.csdn.net/dbanote/article/details/9158367#c ...
- 线段树动态开点+树链剖分BZOJ4999
以每个一个颜色开一颗线段树,内部以dfs序作为线段树节点,权值代表出现次数,维护线段树区间和 #include<iostream> #include<stdio.h> #inc ...
- D - Denouncing Mafia DFS
这道题其实很简单,求k个到根的链,使得链上的节点的个数尽可能多,如果节点被计算过了,就不能再被计算了,其实我们发现,只要k>=叶子节点,那么肯定是全部,所以我们考虑所有的叶子节点,DFS到根节点 ...
- oracle中的闪回
项目中运用: 首先说明:闪回方法有一个前提,就是需要尽早的发现问题,果断的采取行动.若误操作的记录已经在UNDO表空间中被清除,则此方法就不可行了,需要另寻他法. 例如: SELECT * FROM ...