使用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的顺序循环执行. 思路子类化多线程方法 重写子类 ...
随机推荐
- 《第一行代码》之——1.Android简介
Android简介 Android系统架构 (图片源自维基百科) Android大致分为四层架构,五块区域. Linux内核层 Android系统基于Linux2.6,这一层为Android设备的各种 ...
- 【错误收集】SVN冲突解决 标签: 错误收集 2016-03-13 08:44 624人阅读 评论(24) 收藏
最近在倒代码,这真的是一件挺低效率的事情的,但是为了之后工作的进行,必须把这些已经做好的界面,做好的功能搬到新的框架上来,所以安排了10来个同学一起倒代码,因为大家共用一个解决方案,所以使用svn来进 ...
- ACK容器服务发布virtual node addon,快速部署虚拟节点提升集群弹性能力
在上一篇博文中(https://yq.aliyun.com/articles/647119),我们展示了如何手动执行yaml文件给Kubernetes集群添加虚拟节点,然而,手动执行的方式用户体验并不 ...
- 在window.onload中使用setTimeout
window.onload = function(){ function n(i){ alert(1); } setTimeout('n(1)',2000); } 以上代码会报错:n() is not ...
- 基于GIS的空间分析功能分析芝加哥小熊队和白袜队的球迷范围
将交换格式的文件转换为要素类 在ArcCatalog中新建地址定位器 设置地址定位器的样式 选择Arctoolbox->地理编码工具->对地址进行地理编码 定义坐标系 定义坐标系后如图所示 ...
- mysql列转行 行转列
列转行 SELECT flag ,substring_index(substring_index(t.context,), ) as result FROM ( select 'aa' as flag ...
- 快速完成智能数据构建,Dataphin公共云版本全面解读
公测两个月,Dataphin公共云版本已经受到了阿里云上众多轻量级用户的关注.事实上,Dataphin作为一款大数据智能构建与管理的产品,其核心功能是面向各行各业大数据建设.管理及应用诉求,一站式提供 ...
- 爬虫:Selenium + PhantomJS
更:Selenium特征过多(language/UserAgent/navigator/en-US/plugins),以Selenium打开的浏览器处于自测模式,很容易被检测出来,解决方法可选: 用m ...
- C#设置Excel行高、列宽
设置固定值 worksheet.Columns[1].ColumnWidth = 15; 设置自动换行 worksheet.Columns.WrapText = true; 设置自动行高.列宽 xlA ...
- MapReduce数据流-Reduce