问题描述
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);
但是,这有两个问题。
- 我无法立即返回结果。
- 我无法设置我希望它执行的次数。
想知道是否还有更好的方法吗?
解决方法
我从未使用过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次后仍不成功,您也就不想再尝试了。您还希望在连续尝试之间等待半秒。因为我不知道什么是“东西”,所以我做了一些东西。每次尝试时,我都会生成一个介于零到十之间的新随机整数,并将其与某个预定值进行比较。如果数字匹配,则“成功”成功。
我将详细信息打印到屏幕上纯粹是出于调试目的。他们不需要打印语句。您可以安全地删除它们。