java 如何运行多个任务并处理返回第一个结果

在并发编程中。有时候我们需要同时处理多个任务,但是却只需要返回个结果就行。可以通过ThreadpoolExecutor类来实现该应用场景。
首先,需要建一个UserValidator类提供用户验证机制。

  1. UserValidator.java
public class UserValidator {
private String name;
//实现构造方法,初始化name。
public UserValidator(String name){
    this.name = name;
}
public  boolean validator(String name,String password){
    Random random = new Random();
    long duration =(long) (Math.random()*10);
    System.out.printf("Validator %s :Validator a user during %d"
            + "seconds\n",this.name,duration);
    //线程休眠
    try {
        TimeUnit.SECONDS.sleep(duration);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        return false; 
    }
    return random.nextBoolean();
}
public String getName(){
    return name;
}
}

通过TaskValidator.java类执行任务。

package com.java.thread45;

import java.util.concurrent.Callable;

public class TaskValidator implements Callable<String>{
private UserValidator userValidator;
private String user;
private String password;
public TaskValidator(UserValidator userValidator,String user,String password){
    this.userValidator = userValidator;
    this.user = user;
    this.password = password;
}
public String call() throws Exception{
    if(!userValidator.validator(user, password)){
        System.out.printf("the user has not been found\n",userValidator.getName());
    throw new Exception("验证用户失败");
    }
    System.out.printf("%s the user has been found\n",userValidator.getName());
    return userValidator.getName();
}
}

线程主类:
“`
package com.java.thread45;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {
public static void main(String[] args){
String username =”test”;
String password =”test”;
UserValidator a1 = new UserValidator(“啊哈哈”);
UserValidator a2 = new UserValidator(“哈哈”);
TaskValidator b1 = new TaskValidator(a1, username, password);
TaskValidator b2 = new TaskValidator(a2, username, password);
List taskList = new ArrayList();
taskList.add(b1);
taskList.add(b2);
//创建线程执行器
ExecutorService exector = Executors.newCachedThreadPool();
String result;
try {
result = exector.invokeAny(taskList);
System.out.printf(“Main:Result:%s\n”,result);
} catch (Exception e) {
e.printStackTrace();
}
exector.shutdown();//通过shutdown来终止执行器。
System.out.printf(“Main:End of the Execution\n”);
}
}
该线程执行类一共有4种可能结果:
1.两个任务执行都为true。但是只返回第一个执行的结果。
2.有一个位true,一个为false.返回结果为true的那个任务信息。
3.两个都为false则返回异常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值