《Java并发编程心得》第一章:线程&& 线程池(1.4 Runable、Callable、Future三者的差异?如何获取线程的返回值?)

概述

很多场景下,我们需要线程的返回值来进行下一步操作,那么究竟怎么来获取么?
在这里,提供了集中常用的方式以供参考。

获取值的多种方式

传递入参、出参

public class MyRunable implements Runnable {

    private String param;

    @Getter
    private String result;

    public MyRunable(String param) {
        this.param = param;
    }

    @Override
    public void run() {
        result = this.param + " success";
    }

    public static void main(String[] args) {
        MyRunable myRunable = new MyRunable("jszhao");
        Thread a = new Thread(myRunable);
        a.start();

        while (a.isAlive()) ;
        System.out.println(myRunable.getResult()); // "jszhao success"
    }
}

入参出参齐活了…

利用线程池获取返回值
/**
 * 通过线程池获取线程的返回值
 */
public class GetValueByExecutor {
    public static void main(String[] args) {
        ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(20);

        Callable<String> callable = () -> {
            return "success";
        };
        Future<String> submit = executor.submit(callable);

        try {
            String s = submit.get(1, TimeUnit.SECONDS);

            System.out.println(s);// "success"
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Future和Callable的差异

UML图

在这里插入图片描述
由图可以看到,Runable接口中run方法时线程执行的方法主体;Future接口主要定义了对线程状态的一些方法(如取消线程执行、获取方法返回值等),而callable方法主要是回调。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: callable和runnable都是Java中的接口,但是它们有不同的用途和实现方式。 Callable接口是一个泛型接口,它定义了一个call()方法,该方法可以返回一个结果并抛出一个异常。Callable接口通常用于需要返回结果的任务,例如计算任务、文件读取任务等。 Runnable接口是一个简单的接口,它只定义了一个run()方法,该方法不返回任何结果,也不抛出异常。Runnable接口通常用于执行一些简单的任务,例如打印一些信息、更新UI等。 因此,Callable接口比Runnable接口更灵活,可以返回结果并抛出异常,但是它也更复杂。在实际开发中,我们需要根据具体的需求选择使用哪个接口。 ### 回答2: callablerunable都是Java编程语言中用于实现多线程的接口。虽然它们的功能非常相似,但是它们的区别在于接口中的方法: Runnable接口只有一个无参的run()方法,它描述了线程所执行的代码块。当一个线程被执行时,run()方法会被调用。因此,所有实现了Runnable接口的对象都必须实现run()方法。 Callable接口也类似地描述了一段代码块,但它提供了一个比Runnable更为灵活的方法。Callable接口定义了一个call()方法,这个方法也可以用来实现线程,但与run()方法不同的是,它可以返回一个。正因为这个原因,Callable接口比Runnable接口更加适用于一些需要返回结果的操作,比如说执行一些计算或者查询等操作。 在实现Callable接口时,必须指定返回类型。通过这个返回,我们可以在主线程中获取线程的执行结果。得一提的是,当使用Callable接口实现线程时,必须将其包装成Future对象,否则会抛出异常。 总之,Runnable接口和Callable接口都能够实现多线程,但是Callable相对于Runnable更为灵活,可以返回结果,让程序更加高效。而在实际开发中,开发者可以根据需要选择合适的接口来实现线程操作。 ### 回答3: callablerunableJava中常用的两个接口,它们的主要区别在于可用于不同的代码块类型。 Runnable接口是一个很常见的接口,它用于实现线程。它只有一个run()方法,用于定义线程要执行的任务。当线程启动时,run()方法会在单独的线程中被执行。实现Runnable接口的类可以作为一个参数传递给Thread类的构造函数中,并启动一个线程。 Callable接口也是用于实现线程的接口。和Runnable不同的是,它可以返回一个并抛出异常。Callable接口只有一个方法call(),它可以在调用时返回一个Callable接口可以通过Future接口进行封装,以便在异步计算完成后获取结果。 因此,两种接口的主要区别在于是否有返回和异常处理机制。如果你需要在异步计算块(例如在执行一个线程时)完成后返回一个,那么你应该实现Callable接口。如果你只需要执行一个任务而不需要返回任何,那么你应该实现Runnable接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值