Java中的FutureTask实现异步任务代码实例

 更新时间:2024年01月15日 09:41:57   作者:Mu_Mu是一只小白  
这篇文章主要介绍了Java中的FutureTask实现异步任务代码实例,普通的线程执行是无法获取到执行结果的,FutureTask 间接实现了 Runnable 和 Future 接口,可以得到子线程耗时操作的执行结果,AsyncTask 异步任务就是使用了该机制,需要的朋友可以参考下

FutureTask实现异步任务

FutureTask 的执行结果和出现异常的异常对象都会被放到outcome对象中,通过get()方法返回。

1.测试future任务正常返回

public class T2 {
    ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNamePrefix("thread-start-runner").build();
    ExecutorService taskExe = new ThreadPoolExecutor(10, 20, 800L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(100), namedThreadFactory);
    private static final Logger LOG = LoggerFactory.getLogger(T2.class);
    @Test
    public void test2() {
        List<FutureTask<Integer>> taskList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            final int a = i;
            FutureTask<Integer> futureTask = new FutureTask<>(() -> {
                LOG.info("正在进行第" + a + "个任务");
                Thread.sleep(3000);
                return 1;
            });
            taskList.add(futureTask);
            //异步执行
            taskExe.submit(futureTask);
        }
        LOG.info("任务添加完成");
        int count = 0;
        try {
            for (FutureTask<Integer> task : taskList) {
                /*
                FutureTask执行的结果会放入它的私有变量outcome中,其他线程直接调用futureTask.get()去读取该变量即可
                会阻塞直到单个任务执行完毕
                * */
                Integer value = task.get();
                LOG.info("value:" + value);
                count += value;
            }
        } catch (InterruptedException e) {
            LOG.error("线程执行被中断", e);
        } catch (ExecutionException e) {
            LOG.error("线程执行出现异常", e);
        }
        taskExe.shutdown();
        LOG.info("count:" + count);
    }```

执行结果:正常累加。

在这里插入图片描述

2.测试future任务异常返回,通过get()方法拿到异常

@Test
    public void test3() {
        List<FutureTask<Integer>> taskList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            final int a = i;
            FutureTask<Integer> futureTask = new FutureTask<>(() -> {
                LOG.info("正在进行第" + a + "个任务");
                int v=1/0;
                return 1;
            });
            taskList.add(futureTask);
            //异步执行
            taskExe.submit(futureTask);
        }
        LOG.info("任务添加完成");
        int count = 0;
        try {
            for (FutureTask<Integer> task : taskList) {
                /*
                FutureTask执行的结果会放入它的私有变量outcome中(包括异常),其他线程直接调用futureTask.get()去读取该变量即可
                会阻塞直到单个任务执行完毕
                * */
                Integer value = task.get();
                LOG.info("value:" + value);
                count += value;
            }
        } catch (InterruptedException e) {
            LOG.error("线程执行被中断", e);
        } catch (ExecutionException e) {
            LOG.error("线程执行出现异常", e);
        }
        taskExe.shutdown();
        LOG.info("count:" + count);
}

执行结果:捕获到异常。

在这里插入图片描述

3.callable出现异常,不进行get()

   @Test
    public void test4() {
        List<FutureTask<Integer>> taskList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            final int a = i;
            FutureTask<Integer> futureTask = new FutureTask<>(() -> {
                LOG.info("正在进行第" + a + "个任务");
                int v = 1 / 0;
                return 1;
            });
            taskList.add(futureTask);
            //异步执行
            taskExe.submit(futureTask);
        }
        LOG.info("任务添加完成");
        taskExe.shutdown();
    }

执行结果:没有抛出异常。

在这里插入图片描述

到此这篇关于Java中的FutureTask实现异步任务代码实例的文章就介绍到这了,更多相关FutureTask实现异步任务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于Spring的统一功能处理(拦截器)实现

    关于Spring的统一功能处理(拦截器)实现

    这篇文章主要介绍了关于Spring的统一功能处理(拦截器)实现,每个方法中都要单独写用户登录验证的方法,即使封装成公共方法,也一样要传参调用和在方法中进行判断,需要的朋友可以参考下
    2023-05-05
  • SpringBoot内容协商快速入门

    SpringBoot内容协商快速入门

    本文主要介绍了SpringBoot内容协商快速入门,使用ContentNegotiation来实现根据客户端请求自动切换返回格式的功能,感兴趣的可以了解一下
    2025-05-05
  • 使用Java打造交互式Excel仪表板

    使用Java打造交互式Excel仪表板

    如果你经常做数据分析报表,一定见过这种场景:一个Excel表格里塞满了数据,老板想看某个地区、某个月份的数据,你得手动筛选半天,切片器是Excel 2010引入的一个超实用功能,本质上就是可视化的筛选器,今天我来分享一下如何用Java代码给Excel添加切片器,需要的朋友可以参考下
    2026-05-05
  • Spring注解实现循环重试功能(适用场景分析)

    Spring注解实现循环重试功能(适用场景分析)

    这篇文章主要介绍了Spring注解实现循环重试功能,本篇主要简单介绍了Springboot中的Retryable的使用,主要的适用场景和注意事项,当需要重试的时候还是很有用的,需要的朋友可以参考下
    2023-04-04
  • java实现mp3合并的方法

    java实现mp3合并的方法

    这篇文章主要介绍了java实现mp3合并的方法,是Java操作多媒体文件的一个典型应用,非常具有参考借鉴价值,需要的朋友可以参考下
    2014-10-10
  • JAVA线程同步实例教程

    JAVA线程同步实例教程

    这篇文章主要介绍了JAVA线程同步实例教程,在Java程序设计中有着非常广泛的应用,需要的朋友可以参考下
    2014-08-08
  • 全面掌握Java中的循环控制语句与条件判断语句的使用

    全面掌握Java中的循环控制语句与条件判断语句的使用

    这篇文章主要介绍了Java中的循环控制语句与条件判断语句的使用,循环和判断是Java编程中流程控制的基础,需要的朋友可以参考下
    2016-02-02
  • 同时使用@LoadBalanced @RefreshScope注解负载均衡失效分析

    同时使用@LoadBalanced @RefreshScope注解负载均衡失效分析

    这篇文章主要为大家介绍了同时使用@LoadBalanced @RefreshScope负载均衡失效问题分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • java的几种定时器的具体使用(4种)

    java的几种定时器的具体使用(4种)

    本文主要介绍了4种类型的定时器:@Scheduled注解、quartz、new Timer().schedule、使用线程控制的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2021-09-09
  • SpringBoot项目的配置文件中设置server.port不生效问题

    SpringBoot项目的配置文件中设置server.port不生效问题

    这篇文章主要介绍了SpringBoot项目的配置文件中设置server.port不生效问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11

最新评论