Java多线程实现之Callable详解

 更新时间:2023年08月26日 09:47:12   作者:not coder  
这篇文章主要介绍了Java多线程实现之Callable详解,Callable是一个接口,用于实现多线程,与实现Runnable类似,但是功能更强大,通过实现Callable接口,我们需要重写call()方法,该方法可以在任务结束后提供一个返回值,需要的朋友可以参考下

Java多线程实现之Callable接口

(1)java.util.concurrent.Callable是一个泛型接口,只有一个call()方法

(2)call()方法抛出异常Exception异常,且返回一个指定的泛型类对象

例1:利用Callable接口创建子线程类:

package com.my.frame;
import java.util.concurrent.Callable;
public class ThreadCall implements Callable<String> {
    @Override
    public String call() throws Exception {
        // TODO Auto-generated method stub
        System.out.println("=====");
        return "9999";
    }
}
package com.my.frame;
import java.util.concurrent.FutureTask;
public class TestThread {
    public static void main(String[] args) {
        FutureTask<String> ft = new FutureTask<>(new ThreadCall());
        new Thread(ft).start();
    }
}

例2:

        Callable<String> callable = new Callable<String>() {
            @Override
            public String call() throws Exception {
                try {
                    Thread.sleep(1500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return "成功";
            }
        };
        ExecutorService executorService = Executors.newCachedThreadPool();
        Future<String> future = executorService.submit(callable);
        String result = null;
        try {
            result = future.get();
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("result:" + result);

Callable 与 Runnable

都是以 able 结束,可以开启线程

Callable 有返回值

那么现在就有一个问题,子现场是耗时操作的,他的返回值返回给谁用呢,主线程如何不阻塞的情况下拿到子线程的返回值呢?

我们接下来解释这个问题

首先,executorService.submit(callable) 中,executor 调用的不是 execute(callable) 而是 submit(callable)

然后配合 future.get() 去取值,这里的取值,是阻塞式的,能保证我们值的可靠性,这是 Java 在 API 层能做到的上限了。

其中,future 提供一种方法让主线程能够主动去询问后台线程是否执行完毕,他就是:future.isDone()

到此这篇关于Java多线程实现之Callable详解的文章就介绍到这了,更多相关Java多线程Callable内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java组件commons-fileupload实现文件上传

    java组件commons-fileupload实现文件上传

    这篇文章主要介绍了java借助commons-fileupload组件实现文件上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • springboot中PostMapping正常接收json参数后返回404问题

    springboot中PostMapping正常接收json参数后返回404问题

    这篇文章主要介绍了springboot中PostMapping正常接收json参数后返回404问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • Java web实现购物车案例

    Java web实现购物车案例

    这篇文章主要为大家详细介绍了Java web实现购物车案例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 解决@Autowired报错Could not autowire. No beans of ‘XXX‘ type found问题

    解决@Autowired报错Could not autowire. No bea

    介绍了在IDEA中使用@Autowired报错Couldnot autowire. No beans of 'XXX' type found的解决方法,原因是@Autowired在注入service时,由于service接口没有实现类,而mybatis仅需提供Dao接口,导致@Autowired无法识别
    2024-12-12
  • 23种设计模式(8) java外观模式

    23种设计模式(8) java外观模式

    这篇文章主要为大家详细介绍了23种设计模式之java外观模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • Mybatis sqlMapConfig.xml中的mappers标签使用

    Mybatis sqlMapConfig.xml中的mappers标签使用

    这篇文章主要介绍了Mybatis sqlMapConfig.xml中的mappers标签使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。
    2022-01-01
  • 一篇文章带你了解Java方法的使用

    一篇文章带你了解Java方法的使用

    这篇文章主要给大家介绍了关于Java中方法使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-08-08
  • Java Benchmark 基准测试的实例详解

    Java Benchmark 基准测试的实例详解

    这篇文章主要介绍了Java Benchmark 基准测试的实例详解的相关资料,这里提供实例帮助大家学习理解这部分内容,需要的朋友可以参考下
    2017-08-08
  • 手把手带你实现第一个Mybatis程序

    手把手带你实现第一个Mybatis程序

    这篇文章主要介绍了mybatis实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-07-07
  • Java利用HttpClient模拟POST表单操作应用及注意事项

    Java利用HttpClient模拟POST表单操作应用及注意事项

    本文主要介绍JAVA中利用HttpClient模拟POST表单操作,希望对大家有所帮助。
    2016-04-04

最新评论