13-案例实现
案例实现
根据如下步骤来实现本案例。
1.创建一个名为 UserValidator 的类,并实现用户校验的逻辑:
public class UserValidator {
2.声明一个名为 name 的私有 String 变量——用来存储用户校验系统的名称:
private final String name;
3.实现该类的构造方法并初始化类中变量:
public UserValidator(String name) {
this.name=name;
}
4.实现 validate() 方法。该方法接收两个 String 类型的参数,它们分别为需要校验的名称和密码:
public boolean validate(String name, String password) {
5.创建一个名为 random 的 Random 对象:
Random random=new Random();
6.随机等待一段时间后,模拟用户校验过程:
try {
long duration=(long)(Math.random()*10);
System.out.printf("Validator %s: Validating a user during %d
seconds\n", this.name,duration);
TimeUnit.SECONDS.sleep(duration);
} catch (InterruptedException e) {
return false;
}
7.返回一个随机的布尔值。如果用户校验通过,则 validate() 方法返回 true ,否则返回 false :
return random.nextBoolean();
}
8.实现 getName() 方法。该方法返回变量 name 的值:
public String getName(){
return name;
}
9.创建一个名为 ValidatorTask 的类,并发使用 UserValidation 类来执行校验过程,并实现泛型为 String 的 Callable 接口:
public class ValidatorTask implements Callable<String> {
10.声明一个类型为 UserValidator 名为 validator 的私有变量:
private final UserValidator validator;
11.声明两个私有 String 型变量,它们分别名为 user 和 password :
private final String user;
private final String password;
12.实现类的构造方法并初始化全部变量:
public ValidatorTask(UserValidator validator, String user,
String password){
this.validator=validator;
this.user=user;
this.password=password;
}
13.实现 call() 方法并返回一个 String 型对象:
@Override
public String call() throws Exception {
14.如果 user 未通过 UserValidator 对象的校验,则在控制台打印信息记录并抛出 Exception :
if (!validator.validate(user, password)) {
System.out.printf("%s: The user has not been found\n",
validator.getName());
throw new Exception("Error validating user");
}
15.在控制台打印信息通过校验的用户信息,并返回 UserValidator 实例对象的 name 值:
System.out.printf("%s: The user has been found\n",
validator.getName());
return validator.getName();
16.至此,我们可以开始实现应用程序的入口,创建包含 main() 方法的 Main 类:
public class Main {
public static void main(String[] args) {
17.创建两个 String 型对象,分别命名为 username 和 password ,并使用测试值初始化它们:
String username="test";
String password="test";
18.创建两个 UserValidator 对象,分别命名为 ldapValidator 和 dbValidator :
UserValidator ldapValidator=new UserValidator("LDAP");
UserValidator dbValidator=new UserValidator("DataBase");
19.创建两个 TaskValidator 对象,分别命名为 ldapTask 和 dbTask 。分别用 ldapValidator 和 dbValidator 初始化它们:
TaskValidator ldapTask=new TaskValidator(ldapValidator,
username, password);
TaskValidator dbTask=new TaskValidator(dbValidator,
username,password);
20.创建一个 TaskValidator 对象的列表,并把创建的两个对象添加进去:
List<TaskValidator> taskList=new ArrayList<>();
taskList.add(ldapTask);
taskList.add(dbTask);
21.使用 Executors 的 newCachedThreadPool 创建一个新的 ThreadPoolExecutor 对象,并创建一个名为 result 的字符型变量:
ExecutorService executor=(ExecutorService)Executors
.newCachedThreadPool();
String result;
22.调用执行器的 invokeAny() 方法。该方法接收 taskList 作为参数,并返回 String 型结果,并且将该方法的返回值打印到控制台:
try {
result = executor.invokeAny(taskList);
System.out.printf("Main: Result: %s\n",result);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
23.调用 shutdown() 方法终止执行器,并在控制台打印信息来表明程序已经终止:
executor.shutdown();
System.out.printf("Main: End of the Execution\n");