• 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实现线程的方法。后面单独一篇会聊这个类。

  • 相关阅读:
    2023年CNVD漏洞周报16期
    今年最大的开源盛会 KubeCon 为开发者带来了什么?
    如何收集HANA 内存itab trace
    带你了解什么是 Web3.0
    javaIO流05:FileReader和Filewriter
    《Seq2Path: Generating Sentiment Tuples as Paths of a Tree》论文阅读
    01-shell编程规范与变量
    JVM虚拟机:如何查看自己的JVM默认的垃圾回收器
    第四代智能井盖传感器:智能井盖监测传感器怎么监测井盖位移
    新手入门案例学习,基于C# MVC实现汽修管理系统《建议收藏:附完整源码+数据库》
  • 原文地址:https://blog.csdn.net/u011863822/article/details/126645129