线程 - 获取 Java 线程返回值的几种方式

本文探讨了在Java中从子线程获取结果的三种有效方法:主线程等待、使用Thread的join方法以及通过实现Callable接口配合FutureTask或线程池。每种方法都有其适用场景,帮助开发者在多线程环境中更好地控制程序流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在实际开发过程中,我们有时候会遇到主线程调用子线程,要等待子线程返回的结果来进行下一步动作的业务。

那么怎么获取子线程返回的值呢,我这里总结了三种方式:

  1. 主线程等待
  2. Join方法等待
  3. 实现Callable接口

Entity 类

package com.basic.thread;

/**
 * @author zhangxingrui
 * @create 2019-02-17 22:14
 **/
public class Entity {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

主线程等待(这个一看代码便知晓,没什么问题)

public static void main(String[] args) throws InterruptedException {
        Entity entity = new Entity();
        Thread thread = new Thread(new MyRunnable(entity));
        thread.start();
        // 获取子线程的返回值:主线程等待法
        while (entity.getName() == null){
            Thread.sleep(1000);
        }
        System.out.println(entity.getName());
}

Join方法阻塞当前线程以等待子线程执行完毕

public static void main(String[] args) throws InterruptedException {
        Entity entity = new Entity();
        Thread thread = new Thread(new MyRunnable(entity));
        thread.start();
        // 获取子线程的返回值:Thread的join方法来阻塞主线程,直到子线程返回
        thread.join();
        System.out.println(entity.getName());
}

通过实现Callable接口

这里又分为两种情况,通过FutureTask或线程池。

FutureTask

@SuppressWarnings("all")
public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask futureTask = new FutureTask(new MyCallable());
        Thread thread = new Thread(futureTask);
        thread.start();
        if(!futureTask.isDone())
            System.out.println("task has not finished!");
        System.out.println(futureTask.get());
}

线程池

@SuppressWarnings("all")
public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService executorService = Executors.newCachedThreadPool();
        Future future = executorService.submit(new MyCallable());
        if(!future.isDone())
            System.out.println("task has not finished!");
        System.out.println(future.get());
}

 Ps:线程本身内部属于同步关系,等执行完之后再得出结果。线程与线程之间属于异步关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆克和他的代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值