美文网首页
线程顺序执行T1->T2->T3->T3->T2->T1->T1

线程顺序执行T1->T2->T3->T3->T2->T1->T1

作者: wyn_做自己 | 来源:发表于2021-05-28 12:24 被阅读0次

今日份鸡汤:这个世界从不缺少看笑话的人,做不到雪中送炭,也请不要雪上加霜,请保持住那最后一点的善良。

思路:控制线程精确的执行(阻塞或者唤醒),想到的是lock提供的condition,利用await()方法和signal()来实现精准的顺序执行,但是考虑到不是一直顺序循环执行,查看一下规律,然后进行分组:T1->T2->T3(第一组,index=1), T3->T2->T1(第二组,index=2),T1->T2->T3(第三组,index=3),T3->T2->T1(第四组,index=4),这样就知道了index为奇数时:T1执行完唤醒T2,T2执行完唤醒T3,T3执行完唤醒T3;index为偶数时:T1执行完唤醒T1,T2执行完唤醒T1,T3执行完唤醒T2。上代码:

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

/**
 * 线程顺序执行:线程1 -》 线程2 -》线程3 -》线程3 -》线程2 -》线程1
 */
public class SignalTest {

    private int num = 1;
    private Lock lock = new ReentrantLock();
    private Condition condition1 = lock.newCondition();
    private Condition condition2 = lock.newCondition();
    private Condition condition3 = lock.newCondition();

    public void executeTh1(int index) {
        try {
            lock.lock();
            while (num != 1) {
                condition1.await();
            }
            System.out.println(Thread.currentThread().getName() + " 开始执行啦,当前index=" + index);
            if (index % 2 == 1) {
                num = 2;
                condition2.signal();
            } else {
                num = 1;
                condition1.signal();
            }

        } catch (Exception e){

        } finally {
            lock.unlock();
        }
    }

    public void executeTh2(int index) {
        try {
            lock.lock();
            while (num != 2) {
                condition2.await();
            }
            System.out.println(Thread.currentThread().getName() + " 开始执行啦,当前index=" + index);
            if (index % 2 == 1) {

                num = 3;
                condition3.signal();
            } else {
                num = 1;
                condition1.signal();
            }

        } catch (Exception e) {

        } finally {
            lock.unlock();
        }
    }

    public void executeTh3(int index) {
        try {
            lock.lock();
            while (num != 3) {
                condition3.await();
            }
            System.out.println(Thread.currentThread().getName() + " 开始执行啦,当前index=" + index);
            if (index % 2 == 1) {
                num = 3;
                condition3.signal();
            } else {
                num = 2;
                condition2.signal();
            }
        } catch (Exception e) {

        } finally {
            lock.unlock();
        }
    }

    public static void main(String[] args) {
        SignalTest signalTest = new SignalTest();
        new Thread(() -> {
            for(int i = 1 ; i <= 5 ; i++){
                signalTest.executeTh1(i);
            }
        }, "线程1").start();
        new Thread(() -> {
            for(int i = 1 ; i <= 5 ; i++){
                signalTest.executeTh2(i);
            }
        }, "线程2").start();
        new Thread(() -> {
            for(int i = 1 ; i <= 5 ; i++){
                signalTest.executeTh3(i);
            }
        }, "线程3").start();
    }
}

执行结果打印:


image.png

还有一种相对简单的,顺序循环执行线程:T1->T2->T3->T1->T2->T3
懂了上面的案例,想必这种情况就更简单了,去掉index的判断逻辑,然后顺序唤醒就可以啦~

相关文章

  • 线程顺序执行T1->T2->T3->T3->T2->T1->T1

    今日份鸡汤:这个世界从不缺少看笑话的人,做不到雪中送炭,也请不要雪上加霜,请保持住那最后一点的善良。 思路:控制线...

  • leetcode 203--linked list

    注意情况 如果t1指向目标的前一个位置,t1->next是val: 删除后 不可以下移一位,当前的t1就是我们需要...

  • 香港DAY1

    香港4日游攻略 Day1 出发: 上海浦东国际机场T2-香港国际机场T1 起飞9:15-11:15到达 (早上6:...

  • 如何让三个线程按顺序执行?

    有T1、T2、T3三个线程,怎么让三个线程顺序执行?T1执行结束T2执行,T2执行结束T3执行。 join()方法...

  • 线程之同步

    t1和t2 异步编程模型:t1线程执行t1的,t2线程执行t2的同步编程模型:t1线程和t2线程执行,当t1线程必...

  • #T3- Gamification

    Gamificationunder suffering situations. Gainpost-traumati...

  • T2-回归

    回归 Regression就是找到一个函数,通过输入特征x,输出预测结果,结果是一个数值。 建立模型 根据特征建立...

  • 谈谈Java中线程的执行顺序

    线程执行顺序 我们先来看一个简单的例子,我们显示地创建三个线程t1、t2、t3,按照声明的顺序,依次分别调用线程的...

  • 2019 芬兰行 养生堂白桦林之旅

    2019-3/25-3/30出行计划 3月24日、重庆T3-上海浦东T2 启程 DAY.1、上海-赫尔辛...

  • 2019跨年旅行--泰国攻略

    交通 1.航班 12.3012:45-17:05上海-曼谷浦东机场T2-素万那普机场 1.2 17:10-...

网友评论

      本文标题:线程顺序执行T1->T2->T3->T3->T2->T1->T1

      本文链接:https://www.haomeiwen.com/subject/jvkssltx.html