博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java-JUC(十):线程按序交替执行
阅读量:6679 次
发布时间:2019-06-25

本文共 3697 字,大约阅读时间需要 12 分钟。

问题:

有a、b、c三个线程,使得它们按照abc依次执行10次。

实现:

package com.dx.juc.test;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class ABC {    public static void main(String[] args) {        final AlternateDemo alternateDemo=new AlternateDemo();                new Thread(new Runnable() {            public void run() {                for(int i=1;i<10;i++){                    alternateDemo.loopA(i);                }            }        }, "A").start();                new Thread(new Runnable() {            public void run() {                for(int i=1;i<10;i++){                    alternateDemo.loopB(i);                }            }        }, "B").start();                new Thread(new Runnable() {            public void run() {                for(int i=1;i<10;i++){                    alternateDemo.loopC(i);                    System.out.println("---------------------------------------");                }            }        }, "C").start();    }}class AlternateDemo {    private Lock lock = new ReentrantLock();    private Condition conditionA = lock.newCondition();    private Condition conditionB = lock.newCondition();    private Condition conditionC = lock.newCondition();    // 一个标号,标记当前可以执行的线程编号.1-a线程可以执行,2-b线程可以执行,3-c线程可以执行。    private int flag = 1;    public void loopA(int loopNum) {        lock.lock();        try {            // 1)等待喚醒            // 如果flag标记值不是1的话,就让线程处于等待状态,直到其他线程唤醒它。            if (flag != 1) {                conditionA.await();            }            // 2)被喚醒后,開始執行。            for (int i = 1; i <= 1; i++) {                System.out.println(Thread.currentThread().getName() + "-" + loopNum + "-" + i);            }            // 3)修改標記flag,并喚醒下一個線程。            flag = 2;            conditionB.signal();        } catch (InterruptedException e) {            e.printStackTrace();        } finally {            lock.unlock();        }    }    public void loopB(int loopNum) {        lock.lock();        try {            // 1)等待喚醒            // 如果flag标记值不是2的话,就让线程处于等待状态,直到其他线程唤醒它。            if (flag != 2) {                conditionB.await();            }            // 2)被喚醒后,開始執行。            for (int i = 1; i <= 1; i++) {                System.out.println(Thread.currentThread().getName() + "-" + loopNum + "-" + i);            }            // 3)修改標記flag,并喚醒下一個線程。            flag = 3;            conditionC.signal();        } catch (InterruptedException e) {            e.printStackTrace();        } finally {            lock.unlock();        }    }    public void loopC(int loopNum) {        lock.lock();        try {            // 1)等待喚醒            // 如果flag标记值不是3的话,就让线程处于等待状态,直到其他线程唤醒它。            if (flag != 3) {                conditionC.await();            }            // 2)被喚醒后,開始執行。            for (int i = 1; i <= 1; i++) {                System.out.println(Thread.currentThread().getName() + "-" + loopNum + "-" + i);            }            // 3)修改標記flag,并喚醒下一個線程。            flag = 1;            conditionA.signal();        } catch (InterruptedException e) {            e.printStackTrace();        } finally {            lock.unlock();        }    }}

测试打印结果:

A-1-1B-1-1C-1-1---------------------------------------A-2-1B-2-1C-2-1---------------------------------------A-3-1B-3-1C-3-1---------------------------------------A-4-1B-4-1C-4-1---------------------------------------A-5-1B-5-1C-5-1---------------------------------------A-6-1B-6-1C-6-1---------------------------------------A-7-1B-7-1C-7-1---------------------------------------A-8-1B-8-1C-8-1---------------------------------------A-9-1B-9-1C-9-1---------------------------------------

更多实现方案:

请参考《》

转载地址:http://ionao.baihongyu.com/

你可能感兴趣的文章
COBBLER无人值守安装
查看>>
基础知识--JAVA注解ElementType
查看>>
kickstart部署centos6.2 x86_64
查看>>
salt 的用户管理
查看>>
我封装的全文检索之solr篇
查看>>
NFC的第一次接触
查看>>
RHEL7 Connection closed by foreign host.
查看>>
Nodejs开发框架之Loopback介绍
查看>>
微信小程序下拉刷新使用整理
查看>>
ubuntu12.04禁用客人会话
查看>>
我的友情链接
查看>>
JVM垃圾收集器与内存分配策略
查看>>
分析Linux 文件系统访问控制列表
查看>>
Confluence WIKI 安装、破解及添加汉化包(Windows)
查看>>
一起入门Citrix_XenDesktop7系列 二-- 跟着图片通过XenDesktop7交付(发布)应用与共享桌面...
查看>>
MyBatis学习手记(一)MaBatis入门
查看>>
SCTF-2014 writeup(部分)
查看>>
Elasticsearch 连接查询
查看>>
Retrofit入门
查看>>
设置Exchange 通讯组接收外部组织邮件
查看>>