Java 多线程 (PART XIX) 使用Condition实现线程的顺序执行

来源:互联网 发布:hiddns域名注册 编辑:程序博客网 时间:2024/06/01 19:43

join的实现

前面介绍了,如何使用jion方法实现线程的顺序执行。
http://blog.csdn.net/uncle_gy/article/details/78163215

condition的实现

package condition123;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class Main {    volatile private static int nextPrintWho = 1;    volatile private static Lock lock = new ReentrantLock();    final private static Condition condition= lock.newCondition();    public static void main(String[] args) {        Thread threadA = new Thread() {            public void run() {                try {                    lock.lock();                    while (nextPrintWho != 1) {                        condition.await();                    }                    for (int i = 0; i < 3; i++) {                        System.out.println("ThreadA " + (i + 1));                    }                    nextPrintWho = 2;                    condition.signalAll();                } catch (InterruptedException e) {                } finally {                    lock.unlock();                }            }        };        Thread threadB = new Thread() {            public void run() {                try {                    lock.lock();                    while (nextPrintWho != 2) {                        condition.await();                    }                    for (int i = 0; i < 3; i++) {                        System.out.println("ThreadB " + (i + 1));                    }                    nextPrintWho = 3;                    condition.signalAll();                } catch (InterruptedException e) {                } finally {                    lock.unlock();                }            }        };        Thread threadC = new Thread() {            public void run() {                try {                    lock.lock();                    while (nextPrintWho != 3) {                        condition.await();                    }                    for (int i = 0; i < 3; i++) {                        System.out.println("ThreadC " + (i + 1));                    }                    nextPrintWho = 1;                    condition.signalAll();                } catch (InterruptedException e) {                } finally {                    lock.unlock();                }            }        };        Thread[] aArray = new Thread[5];        Thread[] bArray = new Thread[5];        Thread[] cArray = new Thread[5];        for (int i = 0; i < 5; 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 1ThreadA 2ThreadA 3ThreadB 1ThreadB 2ThreadB 3ThreadC 1ThreadC 2ThreadC 3ThreadA 1ThreadA 2ThreadA 3ThreadB 1ThreadB 2ThreadB 3ThreadC 1ThreadC 2ThreadC 3ThreadA 1ThreadA 2ThreadA 3ThreadB 1ThreadB 2ThreadB 3ThreadC 1ThreadC 2ThreadC 3ThreadA 1ThreadA 2ThreadA 3ThreadB 1ThreadB 2ThreadB 3ThreadC 1ThreadC 2ThreadC 3ThreadA 1ThreadA 2ThreadA 3ThreadB 1ThreadB 2ThreadB 3ThreadC 1ThreadC 2ThreadC 3

使用nextwhoPrint来控制下一个打印的线程是谁。每次使用condition.signalAll();来唤醒所有线程,每个线程都检查nextwhoPrint是不是自己的量,如果不是则再次condition.await();不过这里的ABC线程并不保证是同一个循环里的ABC,但是每个A和A之间是同步的。

阅读全文
0 0