ExecutorService 使用invokeAll提交多个任务并等待结果

invokeAll 可以提交多个任务,在任务完成前该方法会阻塞,直到所有任务完成或中断或超时,返回Future列表。

package cn.t3;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

public class T5 {
	private static final ExecutorService exec=Executors.newCachedThreadPool();
	
	public static void main(String[] args) throws InterruptedException {
		Callable<String> c1 = new Callable<String>() {

			@Override
			public String call() throws Exception {
				System.out.println(Thread.currentThread().getName()+"::正在执行计算");
				return "AA";
			}
		};
		Callable<String> c2 = new Callable<String>() {
			
			@Override
			public String call() throws Exception {
				System.out.println(Thread.currentThread().getName()+"::正在执行计算");
				Thread.sleep(3000);
				return "BB";
			}
		};
		Callable<String> c3 = new Callable<String>() {
			
			@Override
			public String call() throws Exception {
				System.out.println(Thread.currentThread().getName()+"::正在执行计算");
				Thread.sleep(1000);
				return "CC";
			}
		};
		
		List<Callable<String>> list = new ArrayList<Callable<String>>();
		list.add(c1);
		list.add(c2);
		list.add(c3);
		
		List<Future<String>> futures = exec.invokeAll(list, 2000, TimeUnit.MILLISECONDS); //阻塞方法,当所有任务执行完毕,中断或超时时返回。
		
		for(Future<String> future:futures){
			try {
				System.out.println(future.get());
			} catch (ExecutionException e) {
				System.out.println("异常");
			} catch (CancellationException e) {
				System.out.println("超时");
			}
		}
		
		exec.shutdown();
	}
	
	
	
}   
pool-1-thread-2::正在执行计算
pool-1-thread-3::正在执行计算
AA
超时
CC

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java ExecutorService 是 Java 并发包中的一个接口,它提供了一种简化多线程编程的方式。它实际上是一个线程池的封装,可以帮助我们管理和控制执行多个任务的线程。 使用 ExecutorService 可以将任务提交给线程池,在线程池中由线程执行任务,而不需要手动创建线程。这种方式可以充分利用现有线程,并且可以根据需要灵活地调整线程的数量,避免了频繁创建和销毁线程的开销,提高了程序的性能和效率。 我们可以通过创建 ExecutorService 对象来使用线程池。一般来说,常用的线程池实现类有 ThreadPoolExecutor、FixedThreadPool、ScheduledThreadPool 等。 使用 ExecutorService 的步骤如下: 1. 创建 ExecutorService 对象,可以通过 Executors 工厂类中的静态方法来创建。 2. 创建任务(Runnable 或 Callable),将任务提交ExecutorService。 3. ExecutorService 会根据具体的线程池实现类来管理线程,并分配线程来执行任务。 4. 执行完任务后,可以通过调用 shutdown() 方法来关闭线程池。 ExecutorService 提供了一系列的方法来管理和控制线程池,如 submit() 方法可以提交任务并返回一个 Future 对象,通过 Future 对象可以获取任务的执行结果;invokeAll() 方法可以同时提交多个任务等待它们全部完成;shutdown() 方法可以平缓地关闭线程池,等待提交任务执行完再关闭线程池。 需要注意的是,使用 ExecutorService 时应注意线程安全问题,如共享变量的同步访问等。此外,对于耗时较长的任务使用异步的方式提交。 总之,ExecutorService使用可以简化多线程编程,提高程序效率,但需要根据具体情况选择合适的线程池实现类和合理配置线程池参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值