在某些情况发生后停止线程 ScheduledThreadPoolExecutor
Stop a thread ScheduledThreadPoolExecutor after some condition occure
我想要一些线程池,运行每隔一段固定的时间执行一些任务(这个线程池一直在获取任务)。每个任务调用一些 API 来获取一些值,该值可以为空。仅当返回值为 null 时,我才希望任务再次 运行 (在固定时间后)。否则,我不希望此任务再次 运行。有什么办法可以实现吗?
我唯一想到的是使用 ScheduledThreadPoolExecutor 并从内部终止特定线程,但我没有找到这样做的方法,而且我不确定这是一个好习惯。
谢谢!
您可以逐个安排任务,并在安排下一个任务之前检查您的状态:
public class Solver {
final long delay = 500L;
String getSomeValue() {
if (Math.random() < 0.8) return "not-null";
return null;
}
void init() {
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(8);
Runnable runnable = new Runnable() {
@Override
public void run() {
long time = System.currentTimeMillis();
String value = getSomeValue();
System.out.println("" + value + " " + System.currentTimeMillis());
if (value == null) {
executor.schedule(this, delay - (System.currentTimeMillis() - time), TimeUnit.MILLISECONDS);
}
}
};
executor.schedule(runnable, delay, TimeUnit.MILLISECONDS);
}
public static void main(String[] args) {
new Solver().init();
}
}
我想要一些线程池,运行每隔一段固定的时间执行一些任务(这个线程池一直在获取任务)。每个任务调用一些 API 来获取一些值,该值可以为空。仅当返回值为 null 时,我才希望任务再次 运行 (在固定时间后)。否则,我不希望此任务再次 运行。有什么办法可以实现吗? 我唯一想到的是使用 ScheduledThreadPoolExecutor 并从内部终止特定线程,但我没有找到这样做的方法,而且我不确定这是一个好习惯。
谢谢!
您可以逐个安排任务,并在安排下一个任务之前检查您的状态:
public class Solver {
final long delay = 500L;
String getSomeValue() {
if (Math.random() < 0.8) return "not-null";
return null;
}
void init() {
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(8);
Runnable runnable = new Runnable() {
@Override
public void run() {
long time = System.currentTimeMillis();
String value = getSomeValue();
System.out.println("" + value + " " + System.currentTimeMillis());
if (value == null) {
executor.schedule(this, delay - (System.currentTimeMillis() - time), TimeUnit.MILLISECONDS);
}
}
};
executor.schedule(runnable, delay, TimeUnit.MILLISECONDS);
}
public static void main(String[] args) {
new Solver().init();
}
}