在一定数量的执行之后如何停止计划重复执行的Runnable

回答:

我有一个Runnable。我有一个使用ScheduledExecutorService和scheduleWithFixedDelay调度此Runnable执行的类。

回答:

我想改变这个班安排了Runnable固定延迟执行 要么 无限期, 直到它已运行一定的次数,取决于被传递给构造函数的参数一些。

如果可能的话,我想使用相同的Runnable,因为从概念上讲应该“运行”相同的东西。

回答:

方法1

有两个Runnable,一个在多次执行(保留计数)后取消计划,另一个不执行:

public class MyClass{

private ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

public enum Mode{

INDEFINITE, FIXED_NO_OF_TIMES

}

public MyClass(Mode mode){

if(mode == Mode.INDEFINITE){

scheduler.scheduleWithFixedDelay(new DoSomethingTask(), 0, 100, TimeUnit.MILLISECONDS);

}else if(mode == Mode.FIXED_NO_OF_TIMES){

scheduler.scheduleWithFixedDelay(new DoSomethingNTimesTask(), 0, 100, TimeUnit.MILLISECONDS);

}

}

private class DoSomethingTask implements Runnable{

@Override

public void run(){

doSomething();

}

}

private class DoSomethingNTimesTask implements Runnable{

private int count = 0;

@Override

public void run(){

doSomething();

count++;

if(count > 42){

// Cancel the scheduling.

// Can you do this inside the run method, presumably using

// the Future returned by the schedule method? Is it a good idea?

}

}

}

private void doSomething(){

// do something

}

}

我宁愿只使用一个Runnable来执行doSomething方法。将调度与Runnable捆绑在一起是错误的。你怎么看待这件事?

方法#2

有一个Runnable来执行我们要定期运行的代码。有一个单独的计划可运行对象,该对象检查第一个可运行对象已运行了多少次,并在达到一定数量时取消。这可能是不准确的,因为它将是异步的。感觉有点麻烦。你怎么看待这件事?

方法#3

扩展ScheduledExecutorService并添加方法“

scheduleWithFixedDelayNTimes”。也许这样的类已经存在了?当前,我正在使用Executors.newSingleThreadScheduledExecutor();我的ScheduledExecutorService实例。我大概必须实现类似的功能才能实例化扩展的ScheduledExecutorService。这可能很棘手。你怎么看待这件事?

没有调度程序的方法[编辑]

我无法使用调度程序。我可以改成这样:

for(int i = 0; i < numTimesToRun; i++){

doSomething();

Thread.sleep(delay);

}

并在某个线程中运行它。你对那个怎么想的?您可能仍然可以使用runnable并直接调用run方法。


任何建议欢迎。我正在寻找辩论,以找到实现目标的“最佳实践”方法。

回答:

您可以在Future上使用cancel()方法。来自scheduleAtFixedRate的javadocs

Otherwise, the task will only terminate via cancellation or termination of the executor

这是一些示例代码,该代码将Runnable包装为另一个,以跟踪原始文件的运行次数,并在运行N次后取消。

public void runNTimes(Runnable task, int maxRunCount, long period, TimeUnit unit, ScheduledExecutorService executor) {

new FixedExecutionRunnable(task, maxRunCount).runNTimes(executor, period, unit);

}

class FixedExecutionRunnable implements Runnable {

private final AtomicInteger runCount = new AtomicInteger();

private final Runnable delegate;

private volatile ScheduledFuture<?> self;

private final int maxRunCount;

public FixedExecutionRunnable(Runnable delegate, int maxRunCount) {

this.delegate = delegate;

this.maxRunCount = maxRunCount;

}

@Override

public void run() {

delegate.run();

if(runCount.incrementAndGet() == maxRunCount) {

boolean interrupted = false;

try {

while(self == null) {

try {

Thread.sleep(1);

} catch (InterruptedException e) {

interrupted = true;

}

}

self.cancel(false);

} finally {

if(interrupted) {

Thread.currentThread().interrupt();

}

}

}

}

public void runNTimes(ScheduledExecutorService executor, long period, TimeUnit unit) {

self = executor.scheduleAtFixedRate(this, 0, period, unit);

}

}

以上是 在一定数量的执行之后如何停止计划重复执行的Runnable 的全部内容, 来源链接: utcz.com/qa/431725.html

回到顶部