使用condition实现顺序执行线程
2017-12-18 17:05
399 查看
package cn.limbo.thread.Condition123; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; /** * <B>功能简述</B><br> * 使用condition实现顺序执行线程 A B C */ public class F { //https://www.cnblogs.com/zhengbin/p/5654805.html /** * 我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制。 * 可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。volatile修饰的变量不允许线程内部缓存和重排序,即直接修改内存。所以对其他线程是可见的。 * 但是这里需要注意一个问题,volatile只能让被他修饰内容具有可见性,但不能保证它具有原子性. * <p> * <p> * Java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程。 * 当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。 * 在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比sychronized关键字更轻量级的同步机制。 */ volatile public static int newxtPrintWho = 1; } class Run { volatile public static int newxtPrintWho = 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) { Thread threadA = new Thread() { @Override public void run() { try { lock.lock(); while (newxtPrintWho != 1) { conditionA.await(); } for (int i = 0; i < 3; i++) { System.out.println("ThreadA " + (i + 1)); } newxtPrintWho = 2; conditionB.signalAll(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } }; Thread threadB = new Thread() { @Override public void run() { try { lock.lock(); while (newxtPrintWho != 2) { conditionB.await(); } for (int i = 0; i < 3; i++) { System.out.println("ThreadB " + (i + 1)); } newxtPrintWho = 3; conditionC.signalAll(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } }; Thread threadC = new Thread() { @Override public void run() { try { lock.lock(); while (newxtPrintWho != 3) { conditionC.await(); } for (int i = 0; i < 3; i++) { System.out.println("ThreadC " + (i + 1)); } newxtPrintWho = 1; conditionA.signalAll(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } }; Thread[] aArray = new Thread[5]; Thread[] bArray = new Thread[5]; Thread[] cArray = new Thread[5]; for (int i = 0; i < cArray.length; i++) { aArray[i] = new Thread(threadA); bArray[i] = new Thread(threadB); cArray[i] = new Thread(threadC); aArray[i].start(); bArray[i].start(); cArray[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 ThreadA 1 ThreadA 2 ThreadA 3 ThreadB 1 ThreadB 2 ThreadB 3 ThreadC 1 ThreadC 2 ThreadC 3
分析:都是按顺序执行
相关文章推荐
- 三个线程轮流执行顺序打印ABC(二):使用Lock+Condition实现
- Java 多线程 (PART XIX) 使用Condition实现线程的顺序执行
- 使用信号量来实现线程的先后执行顺序
- condition实现三个线程顺序执行《2》
- 三个线程轮流执行顺序打印ABC(一):使用Semaphore实现
- java多线程-使用ReentrantLock实现线程的顺序执行
- 三个线程轮流执行顺序打印ABC(三):使用Lock实现
- java使用CountDownLatch实现线程顺序执行
- C#之使用AutoResetEvent实现线程的顺序执行
- java使用CountDownLatch实现线程顺序执行
- JAVA多线程顺序执行(使用join,lock,condition,信号量)原理和java源代码
- 使用java.util.concurrent.ExecutorService实现Java线程异步执行
- . 有一个一维数组,里面存储整形数据,请写一个函数,将他们按从大到小的顺序排列,要求执行效率高,并说明如何改善执行效率(该函数必须自己实现,不能使用php函数)。
- 12-使用java5条件阻塞condition实现线程间通信-实现线程间通信方式(2)
- ReentrantLock使用Condition实现通知部分线程
- 复习基础-JAVA多线程,基于Condition实现子线程、主线程顺序处理
- java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)
- 多线程 : 使用Lock 和 Condition 实现线程间互斥与通信
- 使用信号量控制线程执行顺序,进而控制不同视频流的解码顺序
- java 中的wait和notify以及synchronized的使用,实现两个线程交替执行