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项目中实现使用traceId跟踪请求全流程日志

    Java项目中实现使用traceId跟踪请求全流程日志

    这篇文章主要介绍了Java项目中实现使用traceId跟踪请求全流程日志方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • springboot集成mybatis实例代码

    springboot集成mybatis实例代码

    本篇文章主要介绍了springboot集成mybatis实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • Springboot+Bootstrap实现增删改查实战

    Springboot+Bootstrap实现增删改查实战

    这篇文章主要介绍了Springboot+Bootstrap实现增删改查实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Jexcel实现按一定规则分割excel文件的方法

    Jexcel实现按一定规则分割excel文件的方法

    这篇文章主要介绍了Jexcel实现按一定规则分割excel文件的方法,涉及java操作Excel文件的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • 浅析Java语言中状态模式的优点

    浅析Java语言中状态模式的优点

    状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。这个模式将状态封装成独立的类,并将动作委托到 代表当前状态的对象,我们知道行为会随着内部状态而改变
    2023-02-02
  • Java 手写LRU缓存淘汰算法

    Java 手写LRU缓存淘汰算法

    本文主要讲了如何通过哈希链表这种数据结构来实现LRU算法,提供了三种实现思路,第一种从双向链表开始,借助于HashMap来实现满足要求的LRUCache
    2021-05-05
  • MyBatis 核心组件Configuration实例详解

    MyBatis 核心组件Configuration实例详解

    Configuration用于描述 MyBatis 的主配置信息,其他组件需要获取配置信息时,直接通过 Configuration 对象获取,这篇文章主要介绍了MyBatis核心组件Configuration,需要的朋友可以参考下
    2023-08-08
  • Spring中Websocket身份验证和授权的实现

    Spring中Websocket身份验证和授权的实现

    在Web应用开发中,安全一直是非常重要的一个方面,本文主要介绍了Spring中Websocket身份验证和授权的实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • Java 8 新特性终极版指南详解

    Java 8 新特性终极版指南详解

    Java 8已经公布有一段时间了,种种迹象表明Java 8是一个有重大改变的发行版。本文给大家介绍Java 8 新特性终极版指南详解,需要的朋友参考下
    2016-03-03
  • SpringBoot注册Servlet的三种方法详解

    SpringBoot注册Servlet的三种方法详解

    这篇文章主要介绍了SpringBoot注册Servlet的三种方法详解,教你如何Spring Boot 注册 Servlet、Filter、Listener,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05

最新评论