当前位置:嗨网首页>书籍在线阅读

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.创建一个名为 randomRandom 对象:

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 类来执行校验过程,并实现泛型为 StringCallable 接口:

public class ValidatorTask implements Callable<String> {

10.声明一个类型为 UserValidator 名为 validator 的私有变量:

private final UserValidator validator;

11.声明两个私有 String 型变量,它们分别名为 userpassword

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 型对象,分别命名为 usernamepassword ,并使用测试值初始化它们:

String username="test";
String password="test";

18.创建两个 UserValidator 对象,分别命名为 ldapValidatordbValidator

UserValidator ldapValidator=new UserValidator("LDAP");
UserValidator dbValidator=new UserValidator("DataBase");

19.创建两个 TaskValidator 对象,分别命名为 ldapTaskdbTask 。分别用 ldapValidatordbValidator 初始化它们:

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.使用 ExecutorsnewCachedThreadPool 创建一个新的 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");