三个线程顺序循环输出

先看一个简单的:t1 t2 t3三个线程,按顺序串行执行如何实现?

除了使用newSingleThreadPool整一个单工作线程的线程池/使用一个阻塞队列之外.

用线程类的join()方法在一个线程中启动另一个线程,另外一个线程完成该线程继续执行,为了确保三个线程的顺序你应该先启动最后一个(T3调用T2,T2调用T1),这样T1就会先完成而T3最后完成。

Thread类中的join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行。当我们调用某个线程的这个方法时,这个方法会挂起调用线程,直到被调用线程结束执行,调用线程才会继续执行。join方法必须在线程start方法调用之后调用才有意义。如果一个线程没有start,那它也就无法同步。这是由于只有执行完start方法才会创建线程。join才会有意义。

public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {

            @Override
            public void run() {
                System.out.println("t1");
            }
        });
        Thread t2 = new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    // 引用t1线程,等待t1线程执行完
                    t1.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("t2");
            }
        });
        Thread t3 = new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    // 引用t2线程,等待t2线程执行完
                    t2.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("t3");
            }
        });
        
        //这里三个线程的启动顺序可以任意,大家可以试下!
        t1.start();
        t2.start();
        t3.start();
    }

然后再看这道问题:三个线程顺序循环输出 就比如线程A/B/C 让你循环输出ABC一共n次

这种情况下使用锁即可,在上锁之后进行判断 只有满足顺序的时候才打印 不然就解锁走人了 所以三个线程不管谁拿到锁,都必须是按照ABC的顺序进行打印,同时成功之后改变状态,使得顺序能够正常的执行.

public class ThreeThread {
    private int time;// 控制打印次数
    private int state;// 当前状态值:保证三个线程之间交替打印
    private Lock lock = new ReentrantLock();

    public ThreeThread(int time) {
        this.time = time;
    }

    public void print(String str, int targetNum) {
        for (int i = 0; i < time; ) {
            lock.lock();//上锁
            //只有满足顺序条件的时候才打印 并且state++和i++
            if (state % 3 == targetNum) {
                state++;
                i++;
                System.out.print(str);
            }
            lock.unlock();//解锁
        }
    }


    //ABC三个线程都进入print方法 但是条件中必须满足ABC这样的顺序打印
    //他们三个每个线程都有一个i 所以一共每个线程都要打印5次
    public static void main(String[] args) {
        ThreeThread th = new ThreeThread(5);

        Thread A = new Thread(() -> {
            th.print("A", 0);
        });

        Thread B = new Thread(() -> {
            th.print("B", 1);
        });

        Thread C = new Thread(() -> {
            th.print("C", 2);
        });

        B.start();
        A.start();
        C.start();
    }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值