三个线程顺序输出

一、join介绍

  Thead.join()函数在使用后,会挂起调用线程,直到被调用线程结束执行,调用线程才会继续执行。源码中调用join后,方法会一直检测要join()的线程是否存活(isAlive()方法),直到线程执行完成后,调用线程的this.notifyAll()方法,才会回到刚刚挂起的主程序。基本操作如下:

public class Worker extends Thread {

    // 工作者名
    private String name;
    // 工作时间
    private long time;

    public Worker(String name, long time) {
        this.name = name;
        this.time = time;
    }

    @Override
    public void run() {
        // TODO 自动生成的方法存根
        try {
            System.out.println(name + "开始工作");
     Thread.sleep(time);   
            System.out.println(name + "工作完成,耗费时间=" + time);
        } catch (InterruptedException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    }

}

public static void main(String[] args) throws InterruptedException {
        // TODO Auto-generated method stub
        Worker worker0 = new Worker("worker0", (long) (Math.random() * 1000));
        Worker worker1 = new Worker("worker1", (long) (Math.random() * 1000 + 1000));
        Worker worker2 = new Worker("worker2", (long) (Math.random() * 1000 + 2000));

        worker1.start();
        worker0.start();

        worker1.join();
        worker0.join();
        System.out.println("准备工作就绪");

        worker2.start();
    }

  结果如下:

二、join方式代码实现

  有了上面的介绍很容易想到,三个线程顺序输出,让他们依次join(),按顺序等待执行就好了,代码如下:

public static void main(String[] args) {
        final Thread t1 = new Thread(new Runnable() {
            public void run() {
                System.out.println(Thread.currentThread().getName() + " run 1");
            }
        }, "T1");
        final Thread t2 = new Thread(new Runnable() {
            public void run() {

                try {
                    t1.join();
                    System.out.println(Thread.currentThread().getName() + " run 2");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "T2");
        final Thread t3 = new Thread(new Runnable() {
            public void run() {
                try {
                    t2.join();
                    System.out.println(Thread.currentThread().getName() + " run 3");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "T3");

        t1.start();
        t2.start();
        t3.start();

        //方法二
        // ExecutorService executor = Executors.newSingleThreadExecutor();
        // executor.submit(t1);
        // executor.submit(t2);
        // executor.submit(t3);
        // executor.shutdown();
    }

  效果如图:

三、既然是多线程,自然也可以用加锁的方式实现,直接上代码:

package com.concurrency;

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

public class ThreeTheadPrintByOrder2_Lock {

    public static void main(String[] args) {
        new ThreadA().start();
        new ThreadB().start();
        new ThreadC().start();
    }

    private static Lock lock = new ReentrantLock();
    private static int state = 0;

    static class ThreadA extends Thread {
        @Override
        public void run() {
            for (int i = 0; i < 10;) {
                lock.lock();
                if (state % 3 == 0) {
                    System.out.println(Thread.currentThread().getName() + " A");
                    state++;
                    i++;
                }
                lock.unlock();
            }
        }
    }

    static class ThreadB extends Thread {
        @Override
        public void run() {
            for (int i = 0; i < 10;) {
                lock.lock();
                if (state % 3 == 1) {
                    System.out.println(Thread.currentThread().getName() + " B");
                    state++;
                    i++;
                }
                lock.unlock();
            }
        }
    }

    static class ThreadC extends Thread {
        @Override
        public void run() {
            for (int i = 0; i < 10;) {
                lock.lock();
                if (state % 3 == 2) {
                    System.out.println(Thread.currentThread().getName() + " C");
                    state++;
                    i++;
                }
                lock.unlock();
            }
        }
    }

}

  效果如下:

  

原文地址:https://www.cnblogs.com/lyInfo/p/9130094.html

时间: 2024-11-07 16:15:51

三个线程顺序输出的相关文章

Java实现多线程经典问题:使用三个线程实现输出ABCABC循环

使用三个线程实现ABCABC--循环. 代码如下: //标记类,用来让三个线程共享,同时也是三个线程中同步代码快的标记对象. //之前这个标记我设置成Integer,但是发现Integer进行加法运算时会改变对 //象引用(原因是自动装箱),因此出现异常抛出.所以索性自己定义Flag类. class Flag{ int i=0; public synchronized void setI() { i++; if(i==3) i=0; } } //输出A的线程 class SafeTestA im

三个线程同时输出12345 678910 1112131415....以此类推

package thread; public class th { public static int j = 0; public static void main(String[] args) { for (int i = 0; i < 5; i++) { t tt = new t(); tt.start(); th.xun(); System.out.println("线程1"); d dd = new d();  dd.start(); } } public static

Java多线程:用三个线程控制循环输出10次ABC

题目:有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C,要求, 同时启动三个线程, 按顺序输出ABC, 循环10次. 解题思路:要按顺序输出ABC, 循环10次,就要控制三个线程同步工作,也就是说要让三个线程轮流输出,直到10个ABC全部输出则结束线程.这里用一个Lock对象来控制三个线程的同步.用一个int型变量state标识由那个线程输出. 1 package com.thread; 2 3 import java.util.concurrent.locks.Lock;

启动三个线程A,B,C,按ABC的顺序输出10次

package jun; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /**  * 启动三个线程A,B,C,

任意输入三个整数,按从大到小的顺序输出

#include <stdio.h> void main(){ int a,b,c,t; printf("请输入三个整数:\n"); scanf("%d,%d,%d",&a,&b,&c); if(a<b) { t=a; a=b; b=t; } if(a<c) { t=a; a=c; c=t; } if(b<c) { t=b; b=c; c=t; } printf("从大到小的排序为:%d,%d,%d&q

输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符。

ASCII码排序 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符. 输入 第一行输入一个数N,表示有N组测试数据.后面的N行输入多组数据,每组输入数据都是占一行,有三个字符组成,之间无空格. 输出 对于每组输入数据,输出一行,字符中间用一个空格分开. 样例输入 2 qwe asd 样例输出 e q w a d s #include <iostream> using namespace

ytu 1064: 输入三个字符串,按由小到大的顺序输出(水题,字符串处理)

1064: 输入三个字符串,按由小到大的顺序输出Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 471  Solved: 188[Submit][Status][Web Board] Description 输入三个字符串,按由小到大的顺序输出.分别使用指针和引用方式实现两个排序函数.在主函数中输入和输出数据. Input 3行字符串 Output 按照从小到大输出成3行.由指针方式实现. 按照从小到大输出成3行.由引用方式实现. Sample In

有三个线程T1 T2 T3,如何保证他们按顺序执行-转载

T3先执行,在T3的run中,调用t2.join,让t2执行完成后再执行t3 在T2的run中,调用t1.join,让t1执行完成后再让T2执行 public class Test { // 1.现在有T1.T2.T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行 public static void main(String[] args) { final Thread t1 = new Thread(new Runnable() { @Override public voi

OJ刷题之《输入三个整数,按由小到大的顺序输出》

题目描述 输入三个整数,按由小到大的顺序输出.分别使用指针和引用方式实现两个排序函数.在主函数中输入和输出数据. 输入 三个整数 输出 由小到大输出成一行,每个数字后面跟一个空格.由指针方式实现. 由小到大输出成一行,每个数字后面跟一个空格.由引用方式实现. 样例输入 2 3 1 样例输出 1 2 3 1 2 3 提示 主函数已给定如下,提交时不需要包含下述主函数 /* C++代码 */ int main() { void sort1(int *,int *,int *); void sort2