线程创建的第三种方式——Callable<V>

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程创建的第三种方式——Callable<V>相关的知识,希望对你有一定的参考价值。

参考技术A     提到线程的创建,我们常用的就是继承Thread或者实现Runnable,但其实线程的创建不止这两种方法,还有一种方法就是带有返回值的线程创建Callable<V>,Callable是一个接口,Runnable也是一个接口,看看两者的定义

    Callable<>的使用方式和Runnable也略有不同,需要创建一个FutureTask对象,并传入一个Callable实现类对象,才能使用Thread.start()方法启动线程

    两者都只定义了一个抽象方法,Callable的call方法会有一个泛型v的返回值,而Runnable是没有返回值的,这个返回值有什么作用呢?

    这个返回值可以通过FutrueTask.get()方法获得,主线程获取到这个结果之前,会进行等待,造成线程堵塞,程序会停在这一行等待此Callable<>实现类完成当前线程任务,再继续主线程的执行

    如上图2所示,程序执行完13行之后,会停在14行,等待tc任务的执行,这里我们在图1中延长了此线程的执行时间,可以很明显的看到,控制台在输出了第一行之后,第二行会等待6s之后才执行。

    注意到图1中的call方法是有抛出异常的,而平时经常创建Runnable子类的时候,我们在重写run方法时在遇到异常的时候只能进行try-catch捕获,而不能进行异常的抛出。

    此外,通过对源码的查询,FutrueTask的最终继承类是Futrue,此接口中定义了五个方法:

        1. cancel ​(boolean mayInterruptIfRunning)——如果传入true,代表取消此任务,返回值也是布尔类型,取消成功返回true

        2. get ()——等待任务完成后,主线程获得返回结果

        3. get ​(long timeout, TimeUnit unit)——也可以设指定的等待时间

        4. isCancelled ()——判断任务是否被取消,取消则返回true

        5. isDone ()——判断任务是否完成,已经完成则返回true

    最后,获取FutrueTask对象的方式也可以通过线程池的submit方法,详情请参考其它文章。

友情链接:https://www.cnblogs.com/eoss/p/6109863.html

以上是关于线程创建的第三种方式——Callable<V>的主要内容,如果未能解决你的问题,请参考以下文章

实现线程的第三种方式:实现Callable接口

JUC高级多线程_05:获取线程的第三种方式

JavaSE:线程池

JUC - 多线程之Callable;集合类线程不安全

java创建线程的方式有几种?

线程1