考慮以下幾點:
publicinterface ConflictingRunnable extends Runnable {
boolean hasConflicts(Runnable other);
}
而且
public class ConflictAwareScheduledThreadPoolExecutor {
private final Map<Runnable, ScheduledFuture> scheduledRunnables = new HashMap<>();
private final ScheduledThreadPoolExecutor executor;
public ConflictAwareScheduledThreadPoolExecutor(final ScheduledThreadPoolExecutor executor) {
this.executor = executor;
}
public ScheduledFuture<?> schedule(Runnable command,
long delay,
TimeUnit unit) {
if (command instanceof ConflictingRunnable) {
final ConflictingRunnable conflictingRunnable = (ConflictingRunnable) command;
for (final Iterator<Runnable> itt = scheduledRunnables.keySet().iterator(); itt.hasNext();) {
final Runnable scheduledRunnable = itt.next();
final ScheduledFuture<?> scheduledFuture = scheduledRunnables.get(scheduledRunnable);
if (scheduledFuture.isDone()) {
itt.remove();
} else if (conflictingRunnable.hasConflicts(scheduledRunnable)) {
return null;
}
}
}
final ScheduledFuture<?> t = this.executor.schedule(command, delay, unit);
scheduledRunnables.put(command, t);
return t;
}
}
當你運行:
public class ScheduledTest {
public static void main(String[] args) throws InterruptedException {
final ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(1);
final ConflictAwareScheduledThreadPoolExecutor conflictAwareScheduler = new ConflictAwareScheduledThreadPoolExecutor(scheduler);
for (int i = 0; i < 100; i++) {
conflictAwareScheduler.schedule(new MyTask(i), 100, TimeUnit.MILLISECONDS);
Thread.sleep(10);
}
scheduler.shutdown();
}
private static class MyTask implements ConflictingRunnable {
private final int i;
public MyTask(final int i) {
this.i = i;
}
@Override
public boolean hasConflicts(Runnable other) {
return other instanceof MyTask;
}
@Override
public void run() {
System.out.println(">>> " + i);
}
}
}
你會得到這樣的:
>>> 0
>>> 11
>>> 21
>>> 31
>>> 42
>>> 53
>>> 64
>>> 75
>>> 86
>>> 97
ConflictAwareScheduledThreadPoolExecutor檢查是否與已調度/正在運行的任務發生衝突。如果檢測到與另一個計劃/正在運行的任務發生衝突,則不會計劃其他任務。
你能詳細說明你的用例嗎?你想達到什麼目的?爲什麼?初始任務開始執行後,你是否想安排另一個任務? – Niels
任務不會自動從工作隊列中移除 >直到延遲消失 –
您準備實現什麼功能?我聞到一個X/Y-問題。 – Fildor