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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaWeb登陆功能实现代码

    JavaWeb登陆功能实现代码

    这篇文章主要为大家详细介绍了JavaWeb登陆功能实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • Java删除指定文件夹下的所有内容的方法(包括此文件夹)

    Java删除指定文件夹下的所有内容的方法(包括此文件夹)

    下面小编就为大家带来一篇Java删除指定文件夹下的所有内容的方法(包括此文件夹) 。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • Java实现邮件发送的过程及代码详解

    Java实现邮件发送的过程及代码详解

    这篇文章主要介绍了Java实现邮件发送的过程及代码详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Java8 新特性之日期时间对象及一些其他特性

    Java8 新特性之日期时间对象及一些其他特性

    这篇文章主要介绍了Java8 新特性之日期时间对象及一些其他特性,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • springboot发送邮件功能的实现代码

    springboot发送邮件功能的实现代码

    发邮件是一个很常见的功能,在java中实现需要依靠JavaMailSender这个接口,今天通过本文给大家分享springboot发送邮件功能的实现代码,感兴趣的朋友跟随小编一起看看吧
    2021-07-07
  • 如何使用jakarta.json进行json序列化和反序列化

    如何使用jakarta.json进行json序列化和反序列化

    java里,json框架何其多,常见的有jackson、fastjson、gson等,本文重点介绍如何使用jakarta.json进行json序列化和反序列化,需要的朋友可以参考下,
    2024-07-07
  • Maven中的dependencyManagement 实例详解

    Maven中的dependencyManagement 实例详解

    dependencyManagement的中文意思就是依赖关系管理,它就是为了能通更好统一管理项目的版本号和各种jar版本号,可以更加方便升级,解决包冲突问题,这篇文章主要介绍了Maven中的dependencyManagement 实例详解,需要的朋友可以参考下
    2024-02-02
  • Java如何利用Socket传输信息或文件

    Java如何利用Socket传输信息或文件

    这篇文章主要介绍了Java如何利用Socket传输信息或文件问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Java 构造器原理及用法解析

    Java 构造器原理及用法解析

    这篇文章主要介绍了Java 构造器原理及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • SpringBoot 整合ChatGPT API项目实战教程

    SpringBoot 整合ChatGPT API项目实战教程

    这篇文章主要介绍了SpringBoot整合ChatGPT API项目实战教程,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05

最新评论