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");