栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java并发多线程编程——锁绑定多个条件Condition示例

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java并发多线程编程——锁绑定多个条件Condition示例

目录

一、锁绑定多个条件Condition概述二、锁绑定多个条件Condition示例代码

一、锁绑定多个条件Condition概述

ReentrantLock 用来实现分组唤醒需要唤醒的线程,可以精确唤醒,而不是像synchronized 要么随机唤醒一个线程,要么唤醒全部线程。 二、锁绑定多个条件Condition示例代码

示例需求

示例需求:
多线程之间按顺序调用,实现A->B->C 三个线程启动,要求如下:
A线程 打印1次,  B线程 打印2次,  C线程 打印3次,
紧接着
A线程 打印1次,  B线程 打印2次,  C线程 打印3次,
。。。。
一共遍历3次

示例代码

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

class MyResource{
    private int number =1;//A线程用1表示,B线程用2表示,C线程用3表示

    private Lock lock=new ReentrantLock();
    private Condition c1=lock.newCondition();
    private Condition c2=lock.newCondition();
    private Condition c3=lock.newCondition();

    public void print1(){
        lock.lock();
        try {
            //1、判断!=1,说明A线程不输出,等待
            while(number !=1){
                c1.await();
            }
            //2、A线程输出1次
            for(int i=1;i<=1;i++){
                System.out.println(Thread.currentThread().getName()+"t"+number);
            }
            //3、先修改标志位,然后A线程通知B线程
            number=2;
            c2.signal();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }

    public void print2(){
        lock.lock();
        try {
            //1、判断!=2,说明B线程不输出,等待
            while(number !=2){
                c2.await();
            }
            //2、B线程输出2次
            for(int i=1;i<=2;i++){
                System.out.println(Thread.currentThread().getName()+"t"+number);
            }
            //3、先修改标志位,然后B线程通知C线程
            number=3;
            c3.signal();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }

    public void print3(){
        lock.lock();
        try {
            //1、判断!=3,说明C线程不输出,等待
            while(number !=3){
                c3.await();
            }
            //2、B线程输出3次
            for(int i=1;i<=3;i++){
                System.out.println(Thread.currentThread().getName()+"t"+number);
            }
            //3、先修改标志位,然后C线程通知A线程
            number=1;
            c1.signal();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }
}
public class SyncAndReentrantLockDemo {
    public static void main(String[] args) {
        MyResource myResource=new MyResource();

        new Thread(()->{
            for (int i=1;i<=3;i++){
                myResource.print1();
            }
        },"A线程").start();

        new Thread(()->{
            for (int i=1;i<=3;i++){
                myResource.print2();
            }
        },"B线程").start();

        new Thread(()->{
            for (int i=1;i<=3;i++){
                myResource.print3();
            }
        },"C线程").start();
    }
}

输出结果如下图:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/708549.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号