首页 > java线程 > java线程的join

java线程的join

作者:bin

* 线程的join
* 「当前线程」中,执行「其他线程」的join方法,「当前线程」会进入阻塞,待「其他线程」执行结束后,才会往下继续执行
*
* 时用场景:
* 例如需要批量拉取不同接口的数据,然后统一返回

public class Part6 {


    public static void main(String[] args) throws Exception{
        threadJoin();
        threadJoinConcurrent();
    }


    /**
     * 线程的join
     *  「当前线程」中,执行「其他线程」的join方法,「当前线程」会进入阻塞,待「其他线程」执行结束后,才会往下继续执行
     *
     * 时用场景:
     *          例如需要批量拉取不同接口的数据,然后统一返回
     * @throws Exception
     */
    private static void threadJoin() throws  Exception{

        //1、创建2个线程,放到list里面
        List<Thread> threads = IntStream.range(1,3).mapToObj(Part6::create).collect(Collectors.toList());

        //2、启动这两个线程
        threads.forEach(Thread::start);

        //3、执行线程的join方法, 可以通过注释下面的join操作,来对比前后输出
        for(Thread thread:threads) {
            thread.join();
        }

        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + "#" + i);
            shortSleep();
        }
    }

    private static Thread create(int seq){
        return new Thread(()->{
            for (int i = 0; i < 10; i++) {
                System.out.println(Thread.currentThread().getName() + "#" + i);
                shortSleep();
            }
        }, String.valueOf(seq));
    }

    private static void shortSleep(){
        try {
            //推荐使用封装的TimeUnit方法
            TimeUnit.SECONDS.sleep(1);
        }catch (Exception e) {
            System.out.println("线程被打断sleep,继续执行");
        }
    }


    /**
     * 使用join方法去批量并发拉取数据
     */
    private static  void threadJoinConcurrent() throws  Exception{
        List<ThreadData> threadDatas = IntStream.range(1,3).mapToObj(Part6::createThreadData).collect(Collectors.toList());
        //开始拉取信息
        threadDatas.forEach(ThreadData::start);

        //进行阻塞等待
        for (ThreadData threadData : threadDatas) {
            threadData.join();
        }

        //逐个获取结果
        for (ThreadData threadData : threadDatas) {
            threadData.getData();
        }
    }


    public static ThreadData createThreadData(Integer i){
        return new ThreadData(String.valueOf(i));
    }
}

其中ThreadData为

package com.zengbingo.chapter3;

import java.util.concurrent.TimeUnit;


public class ThreadData extends Thread implements queryInterface{
    public ThreadData(String d){
        data = d ;
    }
    private String data = "";
    @Override
    public String getData() {
        System.out.println("获取查询结果" + data);
        return null;
    }

    @Override
    public void run(){
        System.out.println("做查询操作" + data);
        try {
            TimeUnit.SECONDS.sleep(1);
        }catch (Exception e){

        }
        System.out.println("查询结束" + data);
    }
}

queryInterface为:

package com.zengbingo.chapter3;

public interface queryInterface{
    String getData();
}

您必须 [ 登录 ] 才能发表留言!