Thread子线程全部返回再执行主线程(join实践)

《Java 高并发编程详解》第三章 join实践,里面使用的是java8的lamda表达式,特编写案例学习该方法。

背景:并发查询各大航空公司的航班信息,全部返回后整理成规定格式显示在界面上。

重点:并发查询

代码如下:

//查询接口
public interface FlightQuery {
    List<String> get();
}
public class FlightQueryThread extends Thread implements FlightQuery {

    private String origin;
    private String destination;
    private List<String> flightList = new ArrayList<>();

    public FlightQueryThread(String origin, String destination, String airline) {
        super("[" + airline + "]");
        this.origin = origin;
        this.destination = destination;
    }

    @Override
    public void run() {
        super.run();
        System.out.printf("%s-query from %s to %s \n", getName(), origin, destination);
        //随机值表示查询返回时间
        int randomVal = ThreadLocalRandom.current().nextInt(10);
        try {
            TimeUnit.SECONDS.sleep(randomVal);
            this.flightList.add(getName() + randomVal);
            System.out.printf("The flight is %s,query successFul. \n", getName());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

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

    private static List<String> flightCompany = Arrays.asList("China", "USA", "Russia");

    public static void main(String[] args) {
        List<String> result = search("SH", "BJ");
        System.out.println("--result--");
        result.forEach(System.out::println);
    }

    private static List<String> search(String original, String dest) {
        List<String> result = new ArrayList<>();
//java8 可同等替换下方注释代码,创建线程列表
        List<FlightQueryThread> taskList = flightCompany.stream().map(f -> createSearchThread(f, original, dest)).collect(Collectors.toList());
//        List<FlightQueryThread> taskList = new ArrayList<>();
//        for (String flight : flightCompany) {
//            FlightQueryThread thread = createSearchThread(flight, original, dest);
//            thread.start();
//            taskList.add(thread);
//        };
        taskList.forEach(Thread::start);
        taskList.forEach(t -> {
            try {
//分别join用来阻塞主线程
                t.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
//所有线程均返回,获取每一个的查询结果
        taskList.stream().map(FlightQueryThread::get).forEach(result::addAll);
        return result;
    }

    private static FlightQueryThread createSearchThread(String flight, String original, String dest) {
        return new FlightQueryThread(original, dest, flight);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值