一、前言
通过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】 正在执行...