一个主线程下有多个子线程任务,主线程必须在100秒内将子线程执行的集合结果进行处理返回
实现代码:
package cmd.chengxuyuanzhilu.async; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; /** * @author 微信公众号:程序员之路 * */ class Task implements Callable<String> { @Override public String call() throws Exception { System.out.println(String.format("子线程 %s: 在进行计算", Thread.currentThread().getName())); Thread.sleep(6000); int sum = 0; for (int i = 0; i < 100; i++) sum += i; return "子进程"+Thread.currentThread().getName()+":"+sum; } } /** * @author 微信公众号:程序员之路 * */ public class Test { public static void main(String[] args) { //个人建议,控制线程池中线程的个数,防止开启过多线程造成系统崩溃 ExecutorService executor = Executors.newFixedThreadPool(5); //创建100个任务 List<Task> tasks = new ArrayList<>(); for (int i = 0; i < 100; i++) { Task task = new Task(); tasks.add(task); } //ExecutorService的invokeAll方法执行任务集合中的所有任务,并设置超时时间(100秒)。超时后的任务将取消进行 List<Future<String>> futures = new ArrayList<>(); try { futures = executor.invokeAll(tasks, 100, TimeUnit.SECONDS);//注:执行所有的方法执行完的时间不能超过100秒,超时后的任务将取消执行 } catch (InterruptedException e) { e.printStackTrace(); } executor.shutdown(); Integer i = 1; Integer j = 0; for (Future<String> future : futures) { try { System.out.println(i+" : "+future.get()); i++; }catch (Exception e) { j++; } } System.out.println("未成功执行的任务个数:"+j); } }