From 26834f88f8e7c6f8f7ec4beed2d9938da87b5524 Mon Sep 17 00:00:00 2001 From: Mark Fisher Date: Wed, 24 Sep 2008 17:28:47 +0000 Subject: [PATCH] Iteration on a SynchronizedSet must be manually synchronized (default mutex is the collection instance itself). --- .../scheduling/SimpleTaskScheduler.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/scheduling/SimpleTaskScheduler.java b/org.springframework.integration/src/main/java/org/springframework/integration/scheduling/SimpleTaskScheduler.java index 94d3c3227e..77617117f3 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/scheduling/SimpleTaskScheduler.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/scheduling/SimpleTaskScheduler.java @@ -112,15 +112,17 @@ public class SimpleTaskScheduler implements TaskScheduler { if (!this.running) { return; } + this.running = false; Thread executingThread = this.schedulerTask.executingThread.getAndSet(null); if (executingThread != null) { executingThread.interrupt(); } - for (TriggeredTask task : this.executingTasks) { - task.cancel(true); + synchronized (this.executingTasks) { + for (TriggeredTask task : this.executingTasks) { + task.cancel(true); + } + this.executingTasks.clear(); } - this.executingTasks.clear(); - this.running = false; } finally { this.lifecycleLock.unlock(); @@ -148,7 +150,9 @@ public class SimpleTaskScheduler implements TaskScheduler { while (SimpleTaskScheduler.this.isRunning()) { try { TriggeredTask task = SimpleTaskScheduler.this.scheduledTasks.take(); - SimpleTaskScheduler.this.executor.execute(task); + if (SimpleTaskScheduler.this.isRunning()) { + SimpleTaskScheduler.this.executor.execute(task); + } } catch (InterruptedException e) { Thread.currentThread().interrupt(); @@ -183,7 +187,7 @@ public class SimpleTaskScheduler implements TaskScheduler { SimpleTaskScheduler.this.executingTasks.add(this); super.runAndReset(); SimpleTaskScheduler.this.executingTasks.remove(this); - if (isRunning() && !isCancelled()) { + if (SimpleTaskScheduler.this.isRunning() && !this.isCancelled()) { SimpleTaskScheduler.this.schedule(this, this.scheduledTime, new Date()); } } @@ -207,7 +211,7 @@ public class SimpleTaskScheduler implements TaskScheduler { } public synchronized boolean cancel(boolean mayInterruptIfRunning) { - if (!isCancelled()) { + if (!this.isCancelled()) { SimpleTaskScheduler.this.scheduledTasks.remove(this); } return super.cancel(mayInterruptIfRunning);