首页 > 解决方案 > 并行迭代for循环中的所有机器并检查它们是向上还是向下?

问题描述

我有一个机器列表ArrayList。我正在检查所有这些机器是否都已启动,因此我正在对它们进行 http 调用,如果它们响应则它们已启动,但如果它们没有响应则它们已关闭。如果他们重试 10 次没有响应,我认为他们死了,这意味着如果他们没有响应,我会重试每台机器 10 次。

现在我需要hostnames在 for 循环中并行迭代该列表,所以我想出了下面的代码。是否有任何多线程问题或任何可以改进的地方?我在这里正确使用执行者服务吗?

  private static final ExecutorService executorService = Executors.newFixedThreadPool(20);

  public static void main(String[] args) throws Exception {
    List<String> hostnames = new ArrayList<>();
    //.. populating hostnames

    List<Future<Void>> futures = new ArrayList<Future<Void>>();
    for (final String machine : hostnames) {
      Callable<Void> callable = new Callable<Void>() {
        public Void call() throws Exception {
          String url = "http://" + machine + ":8080/ruok";
          if (!checkServer(url)) {
            System.out.println("server down: " + machine);
          }
          return null;
        }
      };
      futures.add(executorService.submit(callable));
    }
    executorService.shutdown();
    for (Future<Void> future : futures) {
      future.get();
    }
    System.out.println("All done!");
  }

  private static boolean checkServer(final String url) {
    boolean isUp = false;
    int retry = 10;
    for (int i = 1; i <= retry; i++) {
      try {
        RestClient.getInstance().getClient().getForObject(url, String.class);
        isUp = true;
        break;
      } catch (Exception ex) {
        // log exception
      }
    }
    return isUp;
  }

标签: javamultithreadingconcurrencythread-safetyexecutorservice

解决方案


推荐阅读