• Java基础:通过Callable创建多线程


    前面聊了创建线程的两种方式,一个是通过创建Thread类,还有一种是通过接口Runnable创建线程。

    其实上面两种创建线程都有一个共同的问题,那就是没有返回值也就是无法得到线程的返回结果,所以为了支持这个操作也就有了Callable接口。当然也不是说没有返回值,就无法完成所有的操作,毕竟可以设置一个类属性绑定某个值即可,但是这样毕竟不方便。

    Callable

    现在看一下官网解释:
    在这里插入图片描述

    看官网文档可以总结一下几点:

    • Callable可以实现线程返回结果,以及其实现的结果需要通过call方法,而不是run方法。而实现Callable需要重写Call方法。
    • Call方法可以引发异常,而run方法不能。

    但是现象有一个问题了,那就是如何让Callable和线程关联起来,毕竟Runnable可以和Thrend关联起来的:

    在这里插入图片描述

    而Callable无法与Thread进行关联起来,但是通过官网一直提示是对Runable的返回值优化,是否可以通过Runable然后将Callable与Thread关联起来呢?

    然后打开Runnable然后看到如下:

    在这里插入图片描述

    现在只能依次从实现子类中依次查找了,最后发现了FutureTask

    在这里插入图片描述

    可以发现一个规律:

    Callable可以通过FutureTask构造方法得到一个FutureTask,而FutureTaskRunnable的子类。
    
    • 1

    下面就可以进行简单的演示了:

    public class test implements Callable {
    
        public static void main(String[] args) throws ExecutionException, InterruptedException {
            FutureTask futureTask = new FutureTask(new test());
            new Thread(futureTask).start();
    // 通过futuretask得到这个返回值
            System.out.println(futureTask.get());
        }
    
        @Override
        public Object call() throws Exception {
            System.out.println("测试线程");
            return 12;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    其实上面一个线程可以同callable实现,不过应该注意到做FutureTask这个类,现在聊一下这个类的特别之处。
    其中说一点上面用到的FutureTask,其实这个有点像是JavaScript中回调函数了,在JavaScript中回调函数其实也是一种异步运行实现方式。这个本篇就是简单了解,后面单独一篇在捋一下这个类。这里只是简单说一下体验一下即可。毕竟本篇主要要是聊Callable实现线程的方法。后面单独一篇会聊这个类。

  • 相关阅读:
    神经网络一般有哪几个层,神经网络的层数怎么看
    工厂设计模式
    决策树-分析与应用
    Vue (十) --------- 全局事件总线、消息订阅与发布
    CISSP学习笔记:安全脆弱性、威胁和对策
    软考中级(网络工程师考核要点)第一章 计算机网络系统(信道特性应用)第六期(4B/5B编码、数字调制技术和脉冲编码调制)
    Visual Studio 2019 c#的winform开发,基本操作
    uniapp项目实践总结(十三)封装文件操作方法
    研究 | CT图像迭代重建算法研究进展
    【数组】设计有序流
  • 原文地址:https://blog.csdn.net/u011863822/article/details/126645129