文档章节

java 并发 - 运行多个任务并执行第一个结果

pan_1308
 pan_1308
发布于 2017/08/24 11:43
字数 701
阅读 34
收藏 0

一、概述

在并发编程中的一个常见的问题就是:当有多种并发任务解决一个问题时,你只对这些任务的第一个结果感兴趣。比如,你想要排序一个数组,你有多种排序算法, 你可以全部启用它们,但是只是获取第一个结果(对于给定数组排序最快的算法的结果)。

说明:

1、使用 ThreadPoolExecutor.invokeAny(list); 让线程池来帮我们拿到最快返回结果的结果。//执行给定的任务,如果某个任务已成功完成(也就是未抛出异常),则返回其结果。一旦正常或异常返回后,则取消尚未完成的任务。

2、任务结束(完成)的标识是:未抛出异常,正常返回;

3、拿到第一个结果后,执行器会取消未完成的任务,而在多线程中:当线程在活动之前或活动期间处于正在等待、休眠或占用状态且该线程被中断时,抛出InterruptedException异常。

4、如果所有任务都抛出了异常,那么最终返回结果的时候也会抛出异常。(抛出的异常按照最后返回task)

5、invokeAll()方法:当所有任务完成时返回所有任务的future列表。

二、实现

import java.util.Random;

/**
 * 用户验证
 */
public class UserValidator{

	private String name;
	
	public UserValidator(String name){
		this.name = name;
	}
	
	public boolean validator(String name){
		Random random = new Random();
		try {
			Thread.sleep(1000*random.nextInt(2));
			System.out.println(Thread.currentThread().getName() + "-验证:休眠一下-name:" + this.name);
		} catch (InterruptedException e) {
			//e.printStackTrace();
			System.out.println(Thread.currentThread().getName() + "-取消==该任务被中断");
			return false;
		}
		return random.nextBoolean();
	}
	
	public String getName() {
		return name;
	}
}
import java.util.concurrent.Callable;

public class TaskValidator implements Callable<String>{

	private UserValidator userValidator;
	private String user;
	
	public TaskValidator(UserValidator userValidator, String user) {
		this.userValidator = userValidator;
		this.user = user;
	}
	
	@Override
	public String call() throws Exception {
		if(!userValidator.validator(user)){
			System.out.println(Thread.currentThread().getName()+ "-验证操作:The user has not been-name:"+userValidator.getName());
			throw new Exception(Thread.currentThread().getName()+"-Error validating user-name:"+userValidator.getName());
		}
		System.out.println(Thread.currentThread().getName()+"-验证操作:The user has been found-name:"+userValidator.getName());
		return userValidator.getName();
	}
}
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

public class MainValidatorTest {

	public static void main(String[] args) {
	   String user = "test";
	   UserValidator userValidator = new UserValidator("loap");
	   UserValidator userValidator2 = new UserValidator("database");
	   
	   TaskValidator taskValidator = new TaskValidator(userValidator, user);
	   TaskValidator taskValidator2 = new TaskValidator(userValidator2, user);
	   
	   List<TaskValidator> list = new ArrayList<TaskValidator>();
	   list.add(taskValidator);
	   list.add(taskValidator2);
	   
	   ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newCachedThreadPool();
	   String result;
	    try {
	       //接收任务数列,并启动它们,返回完成时没有抛出异常的第一个 任务的结果。该方法返回的数据类型与启动任务的call()方法返回的类型一样。
		   result = executor.invokeAny(list);  
		   System.out.println("Main: Result -- 最后结果: " + result);
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (ExecutionException e) {
			e.printStackTrace();
		}
		executor.shutdown();
		System.out.println("Main: End of the Execution");

	}
}
//console结果:
pool-1-thread-1-验证:休眠一下-name:loap
pool-1-thread-1-验证操作:The user has been found-name:loap
Main: Result -- 最后结果: loap
pool-1-thread-2-取消==该任务被中断
pool-1-thread-2-验证操作:The user has not been-name:database
Main: End of the Execution

 

© 著作权归作者所有

pan_1308
粉丝 5
博文 95
码字总数 58819
作品 0
黄冈
私信 提问
【Java并发性和多线程】Java并发性和多线程介绍

本文为转载学习 原文链接:http://tutorials.jenkov.com/java-concurrency/index.html 译文链接:http://ifeve.com/java-concurrency-thread/ 在过去单CPU时代,单任务在一个时间点只能执行单...

heroShane
2014/01/28
166
0
1、Java并发性和多线程-并发性和多线程介绍

以下内容转自http://ifeve.com/java-concurrency-thread/: 在过去单CPU时代,单任务在一个时间点只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽...

easonjim
2017/06/14
0
0
好程序员Java学习路线之Java并发

好程序员Java学习路线之Java并发,什么是并发?用户通常认为计算机在同一时刻可以做多个事情是理所当然的事情。 例1:例如你可以一边听音乐,一边玩游戏,同时还通过聊天工具和别人聊天。假设...

好程序员IT
05/30
5
0
读书笔记之《Java并发编程的艺术》-线程池和Executor的子孙们

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
718
1
Java 并发:Executors 和线程池

本文译自:Java Concurrency – Part 7 : Executors and thread pools 让我们开始来从入门了解一下 Java 的并发编程。 本文主要介绍如何开始创建线程以及管理线程池,在 Java 语言中,一个最...

红薯
2010/09/15
34K
18

没有更多内容

加载失败,请刷新页面

加载更多

作为一个(IT)程序员!聊天没有话题?试试这十二种技巧

首先呢?我是一名程序员,经常性和同事没话题。 因为每天都会有自己的任务要做,程序员对于其他行业来说;是相对来说比较忙的。你会经常看到程序员在发呆、调试密密麻麻代码、红色报错发呆;...

小英子wep
今天
15
0
【SpringBoot】产生背景及简介

一、SpringBoot介绍 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程,该框架使用了特定的方式来进行配置,从而使开发人员不再需要...

zw965
今天
5
0
简述并发编程分为三个核心问题:分工、同步、互斥。

总的来说,并发编程可以总结为三个核心问题:分工、同步、互斥。 所谓分工指的是如何高效地拆解任务并分配给线程,而同步指的是线程之间如何协作,互斥则是保证同一时刻只允许一个线程访问共...

dust8080
今天
6
0
OSChina 周四乱弹 —— 当你简历注水但还是找到了工作

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @花间小酌 :#今日歌曲推荐# 分享成龙的单曲《男儿当自强》。 《男儿当自强》- 成龙 手机党少年们想听歌,请使劲儿戳(这里) @hxg2016 :刚在...

小小编辑
今天
3.4K
22
靠写代码赚钱的一些门路

作者 @mezod 译者 @josephchang10 如今,通过自己的代码去赚钱变得越来越简单,不过对很多人来说依然还是很难,因为他们不知道有哪些门路。 今天给大家分享一个精彩的 GitHub 库,这个库整理...

高级农民工
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部