首页 > 其他分享 >使用 Callable 和 FutureTask 创建线程

使用 Callable 和 FutureTask 创建线程

时间:2024-08-27 16:05:04浏览次数:10  
标签:异步 Thread 接口 Callable 线程 FutureTask

转自:http://t.csdnimg.cn/jl1ZN

原文链接:https://blog.csdn.net/wzhy2016/article/details/131178612

 

操作流程:
    创建Callable实现类的实例,并实现call方法。
    使用FutureTask类来包装Callable对象(第一步创建实现类的实例)。
    使用FutureTask对象作为Thread对象的target,创建并启动新线程。
    调用FutureTask对象的方法来获取子线程执行结束后的返回值。

代码如下:

public class Prj1Test {
    public static void main(String[] args) {
        // 第一步:创建Callable实现类的实例,并实现call方法。
        Task1 task1 = new Task1();
        // 第二步:使用FutureTask对象包装Callable对象。
        FutureTask<String> futureTask = new FutureTask<String>(task1);
        // 第三步:使用FutureTask对象作为Thread的target,创建并启动。
        Thread t = new Thread(futureTask);
        t.start();
        // 第四步:通过FutureTask的方法获取子线程执行结束后的返回值。
        try {
            String getAnswer = futureTask.get();
            System.out.println("子线程执行结束后的值:"+getAnswer);
        } catch (Exception exp) {
            exp.printStackTrace();
        }
    }
}

 

public class Task1 implements Callable<String> {
    @Override
    public String call() throws Exception {
        System.out.println("Task执行");
        String s = "Right";
        s = s +" Test";
        return s;
    }
}

 

Callable 接口:

 

1. Callable接口位于java.util.concurrent包中。
2. Callable是一个泛型接口,也是一个“函数式接口”。其唯一的抽象方法是call()有返回值,返回值的类型为Callable接口的泛型形参类型。call()抽象方法还有一个Exception的异常声明,容许方法的实现版本的内部异常直接抛出,并且可以不予捕获。
3. Callable与Runnable的区别:Runnable的唯一抽象方法run()没有返回值,也没有受检异常的异常声明;Callable接口的call()方法有返回值,有受检异常的异常声明。

 

问题:
Callable实例能否和Runnable实例一样,作为Thread线程实例的target来使用呢?
答案:不行。
理由:Thread的target属性的类型为Runnable,而Callable接口与Runnable接口之间没有任何继承关
系,并且二者唯一的方法在名字上也不同。

Callable接口实例没有办法作为Thread线程实例的target来使用,既然如此,那么该如何使用Callable接口去创建线程呢?一个在Callable接口与Thread线程之间起到搭桥作用的重要接口马上就登场了。

FutureTask类的UML关系图大致如图所示。

 RunnableFuture 接口:

 RunnableFuture继承了Runnable,Future接口,说明这个接口起到中间作用。

Future 接口:
Future接口至少提供了三大功能:
1)能够取消异步执行中的任务。
2)判断异步任务是否执行完成。
3)获取异步任务完成后的执行结果。


对Future接口的主要方法详细说明如下:
① V get():获取异步任务执行的结果。注意,这个方法的调用是阻塞性的。如果异步任务没有执行完成,异步结果获取线程(调用线程)会一直被阻塞,一直阻塞到异步任务执行完成,其异步结果返回给调用线程。
② V get(Long timeout , TimeUnit unit):设置时限,(调用线程)阻塞性地获取异步任务执行的结果。该方法的调用也是阻塞性的,但是结果获取线程(调用线程)会有一个阻塞时长限制,不会无限制地阻塞和等待,如果其阻塞时间超过设定的timeout时间,该方法将抛出异常,调用线程可捕获此异常。
③ boolean isDone():获取异步任务的执行状态。如果任务执行结束,就返回true。
④ boolean isCancelled():获取异步任务的取消状态。如果任务完成前被取消,就返回true。
⑤ boolean cancel(boolean mayInterruptRunning):取消异步任务的执行。

总体来说,Future是一个对异步任务进行交互、操作的接口。但是Future仅仅是一个接口,通过它没有办法直接完成对异步任务的操作,JDK提供了一个默认的实现类——FutureTask。

 

标签:异步,Thread,接口,Callable,线程,FutureTask
From: https://www.cnblogs.com/sensenh/p/18382907

相关文章

  • 线程中的虚假唤醒
    理论基础:线程间通信:1、生产者+消费者2、通知等待唤醒机制wait和notify为什么一个关于线程的操作,方法却放在Object包下?因为多线程的线程安全,必定依赖于锁,而任何对象都可以当锁对象,所以将公共的方法放入到Object类中。多线程编程模板B:判断干活通知基于以上理论,我们......
  • 多线程-interrupt
    多线程-interrupt中断一个线程非常简单,只需要在其他线程中对目标线程调用interrupt()方法,目标线程需要反复检测自身状态是否是interrupted状态,如果是,就立刻结束运行。1、案例一packagecom.example.one;/***@authortom*/publicclassMain{publicstatic......
  • python aiohttp创建很多线程的问题及解决例子解析
    在使用aiohttp进行异步HTTP请求时,创建大量线程可能会导致性能问题。根据搜索结果,这个问题通常与DNS查询有关,因为默认情况下,每次发送请求时aiohttp.ClientSession都会进行DNS查询,这是一个阻塞操作,会为每次查询创建一个新线程。为了解决这个问题,可以通过指定一个AsyncR......
  • C#上位机开发——多线程启动停止暂停继续
    引用:上位机开发——多线程启动停止暂停继续-哔哩哔哩(bilibili.com)前言初学者学习编程时,很容易因为多线程出现各种问题,导致不敢使用多线程。但是多线程技术在做开发中,是不可忽视的一个技术,基本上我们实际应用中,每个项目都会使用多线程,所以多线程技术必须掌握。为什么要用多......
  • Java线程的实践及原理揭秘
    Java线程的实践及原理揭秘并发是什么?系统支持高并发的因素是哪些?1.如何理解系统的并发一般来说,系统在单位时间内能够承载的并发数就是整个系统同事能够处理的请求数量。对于并发的指标通常通过TPS/QPS来表示QPS:每秒处理的查询数(Queries-Per-Second)TPS:每秒处理的事务数(Tr......
  • java 线程
    1.Java中有哪几种方式来创建线程执行任务1.继承Thread类(单继承)2.Runnable接口(没有继承限制)但是无法返回值3.callable接口结合FutureTask4.利用线程池来创建线程使用ExecutorService调用execute通过runnable创建底层都是基于runnable2.为什么不建议使用Executors来创建......
  • 操作系统终止线程
    终止线程方法1:从线程入口函数中return,主线程除外。方法2:调用pthread_exit函数。voidpthread_exit(void*retval);retval-和线程过程函数的返回值语义相同。注意:在任何线程中调用exit函数都将终止整个进程。问题:主线程结束,子线程是否会跟着一起结束?主线程结束,并不会......
  • 一次性下发100w的优惠券/短信/二维码,兼顾线程池参数可配置 在Spring 中 ThreadPoolTas
    一次性下发100w的优惠券/短信/二维码,兼顾线程池参数可配置在Spring中ThreadPoolTaskExecutor的使用1、场景需求分析针对6.18,11.11这种场景,平台一次性发布500w张优惠券,或者对于锁单用户统一发下100w张确认信息,同时我们平时有抢购茅台的场景,京东一次性发布10w个验证码,主要是针......
  • Python 多线程编程技巧举例
    Python多线程(Multithreading)是一种编程技术,允许在同一程序中同时执行多个独立的逻辑流,即线程。每个线程都有自己的程序计数器、栈空间和局部变量,它们共享同一进程的全局变量、文件描述符和其他系统资源。线程是操作系统调度的基本单位,能够在单个进程中并发运行,从而实现任务......
  • B站宋红康JAVA基础视频教程个人笔记chapter08-09(异常处理+多线程)
    文章目录1.异常处理方式1:try-catch-finally2.异常处理方式1:throws3.程序,进程,线程的区别4.线程的创建4.1线程的创建方式1:4.2线程的创建方式2:5.线程类的常用方法和生命周期5.1线程的生命周期jdk5之前6.线程的安全问题和同步机制6.线程之间的通信6.1为什么需要线程之间......