Java高并发编程学习--5. 线程的join的例子

一、航班查询例子

客户端查询各大航空公司的航班信息,统一接收后返回处理。

二、FightQuery

package fight;

import java.util.List;

public interface FightQuery {
    //不管是Thread的run还是Runnable接口,都是void返回类型,
    //如果想获得线程的运行结果,需要自己定义返回接口
    List<String> get();
}

三、FightQueryTask

package fight;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;

/**
 * @ClassName FightQueryTask
 * @Description TODO
 * @Author Cays
 * @Date 2019/3/11 10:33
 * @Version 1.0
 **/
public class FightQueryTask extends Thread implements FightQuery {
    private final String origin;
    private final String destination;
    private final List<String> flightList=new ArrayList<>();
    public FightQueryTask(String airline,String origin,String destination){
        super("{"+airline+"}");
        this.origin=origin;
        this.destination=destination;
    }

    @Override
    public void run() {
        System.out.println(getName()+"-query from "+origin+" to "+destination);
        int randomVal= ThreadLocalRandom.current().nextInt(10);
        try {
            TimeUnit.SECONDS.sleep(randomVal);
            this.flightList.add(getName()+"-"+randomVal);
            System.out.println("The fight:"+getName()+" list query successful");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Override
    public List<String> get() {
        return this.flightList;
    }
}

四、FightQueryExample

package fight;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @ClassName FightQueryExample
 * @Description TODO
 * @Author Cays
 * @Date 2019/3/11 10:41
 * @Version 1.0
 **/
public class FightQueryExample {
    //1. 合作的各大航空公司
    private static List<String> fightCompany= Arrays.asList(
            "CSA","CEA","HNA"
    );
    public static void main(String []args){
        List<String> results=search("SH","BJ");
        System.out.println("=================result============");
        results.forEach(System.out::println);
    }
    private static List<String> search(String original,String dest){
        final List<String> result=new ArrayList<>();
        //2. 创建查询航班信息的线程列表
        List<FightQueryTask> tasks=fightCompany.stream()
                .map(f->createSearchTask(f,original,dest))
                .collect(Collectors.toList());
        //3. 分别启动这几个线程
        tasks.forEach(Thread::start);
        //4. 分别调用每一个线程的join方法,阻塞当前线程
        tasks.forEach(t->{
            try {
                t.join();
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        });
        //5. 在此之前,当前线程会阻塞住,获取每一个线程的查询结果
        tasks.stream().map(FightQueryTask::get).forEach(result::addAll);
        return result;
    }
    public static FightQueryTask createSearchTask(
            String fight, String original,String dest){
        return new FightQueryTask(fight,original,dest);
    }
}

五、结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_39400984/article/details/89765879
今日推荐