一、需求

  • A、B、C 三个线程,循环10次,打印出自己的名称,ABC,ABC,ABC...
  • A、B、C 三个线程,循环10次,打印出自己的名称,A一次,B三次,C五次,ABBBCCCCC,ABBBCCCCC

1.1、循环打印ABC

package com.example.demo.juc;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; /**
* @author DUCHONG
* @since 2019-01-21 10:46
**/
public class ABC { public static void main(String[] args) { PrintDemo pd=new PrintDemo();
//A 线程
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <=10 ; i++) {
pd.printA(i);
}
}
},"A").start(); //B 线程
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <=10 ; i++) {
pd.printB(i);
}
}
},"B").start(); //C 线程
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <=10 ; i++) {
pd.printC(i);
}
}
},"C").start();
}
} class PrintDemo{ Lock lock =new ReentrantLock(); private Condition conditionA=lock.newCondition();
private Condition conditionB=lock.newCondition();
private Condition conditionC=lock.newCondition(); //哪个线程等待与否的标记,flag的值:
// 1 线程A打印,否则等待,同时将标记设置为2,唤醒线程B
// 2 线程B打印,否则等待,同时将标记设置为3,唤醒线程C
// 3 线程C打印,否则等待,同时将标记设置为1,唤醒线程A 外层一次循环结束。
private Integer flag=1;
//打印A
public void printA(int loop){
try{
lock.lock();
if(flag!=1){
conditionA.await();
} for (int i=1;i<=1;i++) {
System.out.println(Thread.currentThread().getName() + "---" + loop);
}
flag=2;
conditionB.signal();
}
catch(Exception e){
e.printStackTrace();
}
finally {
lock.unlock();
} }
//打印B
public void printB(int loop){
try{
lock.lock();
if(flag!=2){
conditionB.await();
} for (int i=1;i<=1;i++) {
System.out.println(Thread.currentThread().getName() + "---" + loop);
} flag=3;
conditionC.signal();
}
catch(Exception e){
e.printStackTrace();
}
finally {
lock.unlock();
} }
//打印C
public void printC(int loop){
try{
lock.lock();
if(flag!=3){
conditionC.await();
} for (int i=1;i<=1;i++) {
System.out.println(Thread.currentThread().getName() + "---" + loop);
}
flag=1;
conditionA.signal();
}
catch(Exception e){
e.printStackTrace();
}
finally {
lock.unlock();
} } }

结果:

1.2、循环打印ABBBCCCC

package com.example.demo.juc;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; /**
* @author DUCHONG
* @since 2019-01-21 14:15
**/
public class ABBB { public static void main(String[] args) {
PrintABBBDemo pd=new PrintABBBDemo();
//A 线程
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <=10 ; i++) {
pd.printA(i);
}
}
},"A").start(); //B 线程
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <=10 ; i++) {
pd.printB(i);
}
}
},"B").start(); //C 线程
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <=10 ; i++) {
pd.printC(i);
}
}
},"C").start();
} } class PrintABBBDemo{ Lock lock =new ReentrantLock(); private Condition conditionA=lock.newCondition();
private Condition conditionB=lock.newCondition();
private Condition conditionC=lock.newCondition(); //哪个线程等待与否的标记,flag的值:
// 1 线程A打印,否则等待,同时将标记设置为2,唤醒线程B
// 2 线程B打印,否则等待,同时将标记设置为3,唤醒线程C
// 3 线程C打印,否则等待,同时将标记设置为1,唤醒线程A 外层一次循环结束。
private Integer flag=1;
//打印A
public void printA(int loop){
try{
lock.lock();
if(flag!=1){
conditionA.await();
} for (int i=1;i<=1;i++) {
System.out.println(Thread.currentThread().getName() + "---" + loop);
}
flag=2;
conditionB.signal();
}
catch(Exception e){
e.printStackTrace();
}
finally {
lock.unlock();
} }
//打印B
public void printB(int loop){
try{
lock.lock();
if(flag!=2){
conditionB.await();
} for (int i=1;i<=3;i++) {
System.out.println(Thread.currentThread().getName() + "---" + loop);
} flag=3;
conditionC.signal();
}
catch(Exception e){
e.printStackTrace();
}
finally {
lock.unlock();
} }
//打印C
public void printC(int loop){
try{
lock.lock();
if(flag!=3){
conditionC.await();
} for (int i=1;i<=5;i++) {
System.out.println(Thread.currentThread().getName() + "---" + loop);
}
flag=1;
conditionA.signal();
}
catch(Exception e){
e.printStackTrace();
}
finally {
lock.unlock();
} } }

结果:

利用Condition实现多线程交替执行的更多相关文章

  1. Java并发编程(二)如何保证线程同时/交替执行

    第一篇文章中,我用如何保证线程顺序执行的例子作为Java并发系列的开胃菜.本篇我们依然不会有源码分析,而是用另外两个多线程的例子来引出Java.util.concurrent中的几个并发工具的用法. ...

  2. php利用wsh突破函数禁用执行命令(安全模式同理)

    php利用wsh突破函数禁用执行命令(安全模式同理) 前提.需要服务器支持wsh.并知道php安装目录 但是php利用wsh执行命令是没有asp的权限高的.   突破代码 <?php $cmd= ...

  3. ASP.NET 多线程 监控任务执行情况,并显示进度条

    关于多线程的基本概念和知识在本文中不多讲,而且我懂的也不是很透,说的太多误人子弟...对于我来说,做本文提到的功能够用就行,等实现其他效果不够用的时候,再深入研究 推荐看园子里的两篇博客应该就有个基本 ...

  4. 多线程并发执行任务,取结果归集。终极总结:Future、FutureTask、CompletionService、CompletableFuture

    目录 1.Futrue 2.FutureTask 3.CompletionService 4.CompletableFuture 5.总结 ================正文分割线========= ...

  5. new Random().Next(1, 100); 多线程同时执行结果很高概率相同,

    /// <summary> /// new Random().Next(1, 100); 多线程同时执行结果很高概率相同, /// 是用的当前时间为seed,时间相同结果相同 /// // ...

  6. PHP利用CURL_MULTI实现多线程

    PHP中的curl_multi一类函数可以实现同时请求多个url,而不是一个一个依次请求,这就类似一个进程实现了多个线程的功能,因此可以使用PHP利用CURL_MULTI实现完成多线程类的任务,下面就 ...

  7. C# 不使用Task实现的多线程顺序执行

    多线程有很好的并发性即无序性,在某些特殊情况下需要用到多线程然而又要使其具备顺序性,这种时候就有了一个特殊的场景那就是多线程顺序执行,在现在VS2015中Task自带了顺序执行的方法,但在此之前的旧项 ...

  8. Condition实现多线程顺序打印

    Condition实现多线程顺序打印: import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.R ...

  9. 利用osql/ocmd批处理批量执行sql文件

    原文:利用osql/ocmd批处理批量执行sql文件 上周在测试环境建了几十张表,保存了.sql文件,准备在正式环境重建的时候懒得一个个打开建了,做一在网上搜寻了一下,果然有简单点的方法. 利用osq ...

随机推荐

  1. HDU - 5324:Boring Class (CDQ分治&树状数组&最小字典序)

    题意:给定N个组合,每个组合有a和b,现在求最长序列,满足a不升,b不降. 思路:三位偏序,CDQ分治.   但是没想到怎么输出最小字典序,我好菜啊. 最小字典序: 我们倒序CDQ分治,ans[i]表 ...

  2. ueditor使用小结【来源网络】

    原文地址:http://www.cnblogs.com/janes/p/5072496.html ueditor是百度编辑器,官网地址:http://ueditor.baidu.com/website ...

  3. 在 GitHub 公开仓库中隐藏自己的私人邮箱地址

    GitHub 重点在开方源代码,其本身还是非常注重隐私的.这一点与面向企业的 GitLab 很不一样. 不过,你依然可能在 GitHub 上泄露隐私信息,例如企业内部所用的电子邮箱. GitHub 对 ...

  4. pat甲级 1154 Vertex Coloring (25 分)

    A proper vertex coloring is a labeling of the graph's vertices with colors such that no two vertices ...

  5. LeetCode 360. Sort Transformed Array

    原题链接在这里:https://leetcode.com/problems/sort-transformed-array/description/ 题目: Given a sorted array o ...

  6. exec 和 exec_

    exec_ 是six里面针对py2 , py3 兼容,  而做的重新定义.  和 exec 功能一样. 关键一点是:   exec 是一个语法声明,不是一个函数.  也就是说和if,for一样. ex ...

  7. kong 安装

    1. yum 参考信息 https://bintray.com/kong/kong-community-edition-rpm $ sudo yum install epel-release $ su ...

  8. Terraform 多云管理工具

    1. 介绍   Terraform is a tool for building, changing, and versioning infrastructure safely and efficie ...

  9. dos命令行连接操作ORACLE数据库

    C:\Adminstrator> sqlplus "/as sysdba" 查看是否连接到数据库 SQL> select status from v$instance; ...

  10. 全局获取Context

    1.定制一个Application类,管理全局的状态信息 public class MyApplication extends Application{ private static Context ...