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

java线程之定制化通信(多轮顺序打印问题)

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

java线程之定制化通信(多轮顺序打印问题)

一、任务

启用三个线程,打印3轮;

线程一t1,每轮打印1次;

线程二t2,每轮打印2次;

线程三t3,每轮打印3次;

线程:t1,第1轮,第1次打印
线程:t2,第1轮,第1次打印
线程:t2,第1轮,第2次打印
线程:t3,第1轮,第1次打印
线程:t3,第1轮,第2次打印
线程:t3,第1轮,第3次打印
线程:t1,第2轮,第1次打印
线程:t2,第2轮,第1次打印
线程:t2,第2轮,第2次打印
线程:t3,第2轮,第1次打印
线程:t3,第2轮,第2次打印
线程:t3,第2轮,第3次打印
线程:t1,第3轮,第1次打印
线程:t2,第3轮,第1次打印
线程:t2,第3轮,第2次打印
线程:t3,第3轮,第1次打印
线程:t3,第3轮,第2次打印
线程:t3,第3轮,第3次打印
 二、实现 1、定义资源类及打印方法
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Flag {
    int flag = 1;
    private final Lock lock = new ReentrantLock();
    Condition c1 = lock.newCondition();
    Condition c2 = lock.newCondition();
    Condition c3 = lock.newCondition();

    public void print1(int loop) {
        //加锁
        lock.lock();
        try {
            //判断条件
            while (flag != 1) {
                c1.await();
            }
            //执行任务
            for (int i = 0; i < 1; i++) {
                System.out.println(String.format("线程:%s,第%s轮,第%s次打印", Thread.currentThread().getName(), loop, i + 1));
            }
            //修改标志位
            flag = 2;
            //通知
            c2.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            //解锁
            lock.unlock();
        }
    }

    public void print2(int loop) {
        //加锁
        lock.lock();
        try {
            //判断条件
            while (flag != 2) {
                c2.await();
            }
            //执行任务
            for (int i = 0; i < 2; i++) {
                System.out.println(String.format("线程:%s,第%s轮,第%s次打印", Thread.currentThread().getName(), loop, i + 1));

            }
            //修改标志位
            flag = 3;
            //通知
            c3.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            //解锁
            lock.unlock();
        }
    }

    public void print3(int loop) {
        //加锁
        lock.lock();
        try {
            //判断条件
            while (flag != 3) {
                c3.await();
            }
            //执行任务
            for (int i = 0; i <3; i++) {
                System.out.println(String.format("线程:%s,第%s轮,第%s次打印", Thread.currentThread().getName(), loop, i + 1));

            }
            //修改标志位
            flag = 1;
            //通知
            c1.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            //解锁
            lock.unlock();
        }
    }
}
2、创建线程,执行任务
 public static void main(String[] args) {
        Flag flag = new Flag();
        new Thread(() -> {
            for (int i = 0; i < 3; i++) {
                flag.print1(i + 1);
            }
        }, "t1").start();
        new Thread(() -> {
            for (int i = 0; i < 3; i++) {
                flag.print2(i + 1);
            }
        }, "t2").start();
        new Thread(() -> {
            for (int i = 0; i < 3; i++) {
                flag.print3(i + 1);
            }
        }, "t3").start();
    }

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

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

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