可以使用ExecutorService将Callable安排为以0.5秒的延迟运行20次并“提前中断”吗?

问题描述

ResponsePOJO response = new ResponsePOJO();

for (int i = 0; i < 20; i++) {
    response = processResponse(client.execute(get));
    if (response.getStatus().equalsIgnoreCase("completed")) {
        break;
    }
    else { 
        Thread.sleep(500);
    }
}

return response;

使用ExecutorService是否有更好的方法?

我正尝试用

ScheduledExecutorService executor = Executors
  .newSingleThreadScheduledExecutor();

Future<String> resultFuture = executor.scheduleAtFixedRate(runnableTask,1,500,TimeUnit.MILLISECONDS);

但是,这有两个问题。

  1. 我无法立即返回结果。
  2. 我无法设置我希望它执行的次数。

想知道是否还有更好的方法吗?

解决方法

我从未使用过ScheduledExecutorService,但是基于this example,我想到了以下代码。我想这可能不是最好的代码,因为这是第一步。尽管如此,它还是可以完成工作。代码后的说明。

import java.time.LocalTime;
import java.util.Random;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;

public class SchedTst {
    static volatile AtomicBoolean  completed;
    static int  count;
    static int  val;
    static Random  rand;

    public static void main(String[] args) {
        rand = new Random();
        val = rand.nextInt(10);
        System.out.println("val = " + val);
        ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
        Runnable command = () -> {
            System.out.printf("%2d. %s%n",(count + 1),LocalTime.now());
            if (++count > 20) {
                completed = new AtomicBoolean();
                System.out.println("FALSE");
            }
            else {
                int anInt = rand.nextInt(10);
                System.out.println("anInt = " + anInt);
                if (anInt == val) {
                    completed = new AtomicBoolean(true);
                    System.out.println("TRUE");
                }
            }
        };
        ScheduledFuture<?> sf = executor.scheduleWithFixedDelay(command,5,1,TimeUnit.SECONDS);
        while (completed == null) {
            // Do nothing.
        }
        sf.cancel(true);
        executor.shutdown();
        System.out.println(completed);
    }
}

基本上,您想尝试尝试最多20次。一旦成功,您就不想再尝试了;如果尝试20次后仍不成功,您也就不想再尝试了。您还希望在连续尝试之间等待半秒。因为我不知道什么是“东西”,所以我做了一些东西。每次尝试时,我都会生成一个介于零到十之间的新随机整数,并将其与某个预定值进行比较。如果数字匹配,则“成功”成功。

我将详细信息打印到屏幕上纯粹是出于调试目的。他们不需要打印语句。您可以安全地删除它们。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...