4.1.16ReentrantLock让线程顺序执行
来源:互联网 发布:淘宝旺旺账号数字id 编辑:程序博客网 时间:2024/06/10 18:06
package demo;/** * Created by sunyifeng on 17/10/19. */public class F { volatile public static int nextPrintWho = 1;}
package demo;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;/** * Created by sunyifeng on 17/10/19. */public class Run { volatile private static int nextPrintWho = 1; private static ReentrantLock lock = new ReentrantLock(); final private static Condition conditionA = lock.newCondition(); final private static Condition conditionB = lock.newCondition(); final private static Condition conditionC = lock.newCondition(); public static void main(String[] args) { // 线程A Thread threadA = new Thread() { public void run(){ try { lock.lock(); while (nextPrintWho != 1) { conditionA.await(); } for (int i = 0; i < 3; i++) { System.out.println("ThreadA " + (i + 1)); } nextPrintWho = 2; conditionB.signalAll(); } catch (InterruptedException e) { e.printStackTrace(); }finally { lock.unlock(); } } }; // 线程B Thread threadB = new Thread(){ public void run(){ try { lock.lock(); while (nextPrintWho != 2) { conditionB.await(); } for (int i = 0; i < 3; i++) { System.out.println("ThreadB " + (i + 1)); } nextPrintWho = 3; conditionC.signalAll(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } }; // 线程C Thread threadC = new Thread(){ public void run(){ try { lock.lock(); while (nextPrintWho != 3) { conditionC.await(); } for (int i = 0; i < 3; i++) { System.out.println("ThreadC " + (i + 1)); } nextPrintWho = 1; conditionC.signalAll(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } }; Thread[] arrA = new Thread[5]; Thread[] arrB = new Thread[5]; Thread[] arrC = new Thread[5]; for (int i = 0; i < 5; i++) { arrA[i] = new Thread(threadA); arrB[i] = new Thread(threadB); arrC[i] = new Thread(threadC); // arrA[i].start(); arrB[i].start(); arrC[i].start(); } }}
执行结果:ThreadA 1
ThreadA 2
ThreadA 3
ThreadB 1
ThreadB 2
ThreadB 3
ThreadC 1
ThreadC 2
ThreadC 3
ThreadA 1
ThreadA 2
ThreadA 3
ThreadB 1
ThreadB 2
ThreadB 3
ThreadC 1
ThreadC 2
ThreadC 3
ThreadA 1
ThreadA 2
ThreadA 3
ThreadB 1
ThreadB 2
ThreadB 3
ThreadC 1
ThreadC 2
ThreadC 3
ThreadA 1
ThreadA 2
ThreadA 3
ThreadB 1
ThreadB 2
ThreadB 3
ThreadC 1
ThreadC 2
ThreadC 3
程序分析:
使用condition对象让线程按照排列顺序执行
阅读全文
0 0
- 4.1.16ReentrantLock让线程顺序执行
- Java中使用ReentrantLock控制线程执行顺序
- join()之让线程按顺序执行
- 有三个线程,怎么让他们按顺序执行
- 让Block顺序执行
- 线程顺序执行(phtread)
- 控制线程顺序执行
- 线程执行顺序例子
- 三个线程顺序执行
- thread 线程执行顺序
- Java 线程的执行顺序
- JAVA线程分组顺序执行
- CountDownLatch控制线程执行顺序
- java 线程按顺序执行
- Android中让多个线程顺序执行
- NSOperation 线程终止 顺序执行
- Java线程循环顺序执行
- 三个线程依次顺序执行
- 欢迎使用CSDN-markdown编辑器
- Spring Bean
- vs2017 创建安装项目
- redis 数据类型详解 以及 redis适用场景场合
- ElasticSearch 单个节点监控
- 4.1.16ReentrantLock让线程顺序执行
- Spring,SpringMVC,Struts是线程安全的吗
- Java SE——三大特性之封装
- 函数实现指定位置搜索
- 【Unity Shader入门精要】— 开始Unity Shader之旅
- PHP--ajax
- Elimination Round 2-A. Search for Pretty Integers
- PAT-Head of Hangs
- 使用ReferenceQueue实现对ClassLoader垃圾回收过程的观察、以及由此引发的ClassLoader内存泄露的场景及排查过程