ExecutorCompletionService

ExecutorCompletionService介绍

ExecutorCompletionService 是 Java 提供的一个用于并发处理任务的类。它的作用类似于 ExecutorService,但它可以让我们更方便地处理多个任务的结果。它是通过将多个任务提交到线程池中执行,并且在任务执行完成后将其结果保存到一个队列中来实现的。

使用 ExecutorCompletionService 可以获得以下好处:

  1. 充分利用多个线程:我们可以通过 ExecutorCompletionService 提交多个任务到线程池中同时执行,并且可以在任务执行完成后立即处理其结果。

  2. 优化任务完成的顺序:由于 ExecutorCompletionService 会将任务执行的结果保存到一个阻塞队列中,所以可以根据任务完成的顺序来处理它们的结果。

  3. 简化代码:使用 ExecutorCompletionService 可以减少代码量,因为我们不用手动地创建一个队列来保存任务的结果,也不用自己写复杂的代码来处理任务的返回结果。

使用 ExecutorCompletionService 的基本流程如下:

  1. 创建一个 ExecutorCompletionService 对象,并将其与一个线程池关联起来。

  2. 将多个任务提交到线程池中执行。

  3. 通过 take() 方法获取执行结果。

  4. 处理任务完成后的结果。

总之,ExecutorCompletionService 是一个非常方便的类,可以让我们在并发编程中更加高效地处理任务的执行和结果。

/** 
	 * @Title: executeRecptionTask
	 * @Description: 执行接收处理任务
	 * @param recptionValues
	 * @author 
	 * @date 2023-07-06 09:14:25
	 */ 
	protected void executeRecptionTask(List recptionValues) {
		ExecutorService threadPool = null;
		try {
			List> batchLists = batchList(recptionValues, BATCHCOUNT);
			int batchNum = batchLists.size();
			threadPool = Executors.newFixedThreadPool(batchNum);
			//ExecutorCompletionService 提交并行任务,并获取结果
			CompletionService cService = new ExecutorCompletionService(threadPool);
			Callable recptTask = null;
			for (List batchList : batchLists) {
				recptTask = getRecptionTask(batchList);
				cService.submit(recptTask);
			}
		
			  // 阻塞获取线程执行结果
            Future futureTask = null;
            boolean isSuccess = false;
            for (int i = 0; i < batchNum; i++) {
                futureTask = cService.take();
                isSuccess = futureTask.get();
                LOGGER.info("thread: " + i + " issuccess: " + isSuccess);
            }
		} catch (Exception e) {
			LOGGER.error("execute recption task error!", e);
		} finally {
			// 线程池关闭
			if (threadPool != null) {
				threadPool.shutdown();
			}
		}
	}

ExecutorCompletionService适合在什么情况下使用

ExecutorCompletionService 适合在需要异步处理多个任务,并在所有任务完成后对结果进行统一处理的场景中使用,特别是当需要及时处理完成的任务而不是等待整个批次完成时,ExecutorCompletionService 尤其适用。

使用 ExecutorCompletionService 可以将任务的提交和任务结果的收集分离开来,以便更好地利用计算资源和优化执行效率。通过将任务的提交和处理分离,在执行器中可以并发地执行多个任务,并在每个任务完成后快速收集任务的结果。这种方式可以最大化地利用计算资源,提高计算效率。

对于一些耗时的任务,如果在任务执行期间阻塞等待任务完成,会导致线程资源的浪费。使用ExecutorCompletionService 可以避免这种浪费,提高系统的吞吐量和并发性能。

例如,在一个计算密集型的应用中,需要对大量的数据进行处理,可以将这些数据拆分为多个任务,然后使用 ExecutorCompletionService 并发地执行这些任务,待所有任务完成后再将结果进行合并处理。这种方式可以充分利用计算资源,提高计算效率,优化应用性能。

总之,ExecutorCompletionService 在需要异步处理多个任务并需要对结果进行统一处理的场景中非常适用,可以帮助开发者提高计算效率、优化系统性能和利用计算资源。

你可能感兴趣的:(java)