首页

通过Future等待获取基于Callable子任务返回结果代码示例

标签:Future,Callable,多线程     发布时间:2022-12-06   

一、前言

通过java.util.concurrent.Future获取java.util.concurrent.Callable定义返回结果子任务,并通过future.get() 等待多线程池子任务执行执行结束(更多子任务同步处理代码示例),并打印所有任务完成结果,点击更多多线程代码示例&教程下载(《亿级流量Jαva高并发与网络编程实战》-源码)。

二、代码示例

1)定义java.util.concurrent.Callable有返回状态子任务

package com.xwood.demo.thread;@b@@b@import java.util.concurrent.Callable;@b@@b@public class ThreadTask implements Callable<String> {@b@    private String tname;@b@@b@    public ThreadTask(String tname) {@b@        this.tname = tname;@b@    }@b@@b@    @Override@b@    public String call() throws Exception {@b@        //获取当前线程的名字@b@        String name = Thread.currentThread().getName();@b@        long currentTimeMillis = System.currentTimeMillis();@b@        System.out.println(name + " - 【" + tname + "】 启动时间:" + currentTimeMillis);@b@        //模拟线程执行...@b@        Thread.sleep((long) Math.random() * 2000);@b@        System.out.println(name + " - 【" + tname + "】 正在执行...");@b@        return name + " - 【" + tname + "】";@b@    }@b@}

2)main测试类 - newScheduledThreadPool定时任务线程池创建多个子线程任务(更多线程池用法代码示例)

package com.xwood.demo.thread;@b@@b@import java.util.ArrayList;@b@import java.util.concurrent.Executors;@b@import java.util.concurrent.Future;@b@import java.util.concurrent.ScheduledExecutorService;@b@import java.util.concurrent.TimeUnit;@b@@b@public class FutureTaskTest {@b@@b@    public static void main(String[] args) throws Exception {@b@        Future<String> result = null;@b@        ScheduledExecutorService schedulPool = Executors.newScheduledThreadPool(4);@b@        ArrayList<Future<String>> results = new ArrayList<Future<String>>();@b@        for (int i = 0; i < 2; i++) {@b@            /*@b@             * schedule(a,b,c)三个参数的含义:@b@             * a:向线程池中提交的任务;@b@             * b:该任务等待多长时间之后,才会被执行@b@             * c:b的时间单位@b@             */@b@            result = schedulPool.schedule(new ThreadTask("thread"+i), 1, TimeUnit.SECONDS);@b@            //存储各个线程的执行结果@b@            results.add(result);@b@        }@b@        //打印结果@b@        for(Future<String> res: results){@b@            System.out.println(res.isDone() ? "已完成":"未完成");@b@            System.out.println("等待线程执行完毕后,返回的结果: " + res.get());//等待任务执行完成,并获取执行结果@b@//            System.out.println("等待线程执行完毕后,返回的结果2: " + res.get(1,TimeUnit.SECONDS));//在指定的时间内会等待任务执行,超时则抛异常。@b@        }@b@        schedulPool.shutdown();@b@@b@        System.out.println("all完成!");@b@    }@b@@b@}

运行控制台结果

未完成@b@pool-1-thread-2 - 【thread1】 启动时间:1670340306862@b@pool-1-thread-1 - 【thread0】 启动时间:1670340306862@b@pool-1-thread-1 - 【thread0】 正在执行...@b@pool-1-thread-2 - 【thread1】 正在执行...@b@等待线程执行完毕后,返回的结果: pool-1-thread-1 - 【thread0】@b@已完成@b@等待线程执行完毕后,返回的结果: pool-1-thread-2 - 【thread1】@b@all完成!

future.get(1,TimeUnit.SECONDS)指定超时时间,控制台打印结果

未完成@b@Exception in thread "main" java.util.concurrent.TimeoutException@b@	at java.util.concurrent.FutureTask.get(FutureTask.java:205)@b@	at com.xwood.demo.thread.FutureTaskTest.main(FutureTaskTest.java:30)@b@pool-1-thread-2 - 【thread1】 启动时间:1670342724596@b@pool-1-thread-1 - 【thread0】 启动时间:1670342724596@b@pool-1-thread-2 - 【thread1】 正在执行...@b@pool-1-thread-1 - 【thread0】 正在执行...