Skip to content

Commit 96ec364

Browse files
[FIX] Start jobs only once (II). #2543
1 parent 2b8ce6d commit 96ec364

File tree

2 files changed

+10
-17
lines changed

2 files changed

+10
-17
lines changed

basex-core/src/main/java/org/basex/core/jobs/QueryJob.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import java.util.*;
77
import java.util.Map.*;
8+
import java.util.concurrent.atomic.*;
89
import java.util.function.*;
910

1011
import org.basex.core.*;
@@ -34,7 +35,7 @@ public final class QueryJob extends Job implements Runnable {
3435
/** Remove flag. */
3536
private boolean remove;
3637
/** Running flag. */
37-
private boolean running;
38+
private final AtomicBoolean running = new AtomicBoolean(false);
3839

3940
/**
4041
* Constructor, which creates and registers the specified job.
@@ -98,7 +99,7 @@ public QueryJob(final QueryJobSpec job, final Context context, final InputInfo i
9899
}
99100

100101
// create and schedule job task
101-
final QueryJobTask task = new QueryJobTask(this, jobs, delay, interval, duration);
102+
final QueryJobTask task = new QueryJobTask(this, delay, interval, duration);
102103
jobs.tasks.put(id, task);
103104
if(interval > 0) {
104105
jobs.timer.scheduleAtFixedRate(task, delay, interval);
@@ -176,16 +177,14 @@ void remove() {
176177
}
177178

178179
/**
179-
* Indicates if the job is currently running.
180-
* @return result of check
180+
* Starts the job if it is not currently running.
181181
*/
182-
boolean running() {
183-
return running;
182+
void startIfNotRunning() {
183+
if(running.compareAndSet(false, true)) new Thread(this).start();
184184
}
185185

186186
@Override
187187
public void run() {
188-
running = true;
189188
try {
190189
result.init();
191190

@@ -265,7 +264,7 @@ public void run() {
265264
if(result.value != null && result.value.isEmpty()) ctx.jobs.results.remove(id);
266265
}
267266
} finally {
268-
running = false;
267+
running.set(false);
269268
}
270269
}
271270

basex-core/src/main/java/org/basex/core/jobs/QueryJobTask.java

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@
1313
public final class QueryJobTask extends TimerTask {
1414
/** Job. */
1515
public final QueryJob job;
16-
/** Job pool. */
17-
public final JobPool jobs;
1816
/** Interval. */
1917
public final long interval;
2018
/** End time (@link {@link Long#MAX_VALUE}: no end). */
@@ -26,16 +24,13 @@ public final class QueryJobTask extends TimerTask {
2624
/**
2725
* Constructor.
2826
* @param job job
29-
* @param jobs job pool
3027
* @param delay delay (ms)
3128
* @param interval interval (ms; no repetition: {@code 0})
3229
* @param duration total duration (ms; no limit: {@link Long#MAX_VALUE})
3330
*/
34-
public QueryJobTask(final QueryJob job, final JobPool jobs, final long delay,
35-
final long interval, final long duration) {
36-
31+
public QueryJobTask(final QueryJob job, final long delay, final long interval,
32+
final long duration) {
3733
this.job = job;
38-
this.jobs = jobs;
3934
this.interval = interval;
4035
final long time = System.currentTimeMillis();
4136
start = time + delay;
@@ -50,8 +45,7 @@ public void run() {
5045
job.remove();
5146
cancel();
5247
}
53-
// skip execution if same job is still running
54-
if(!job.running()) new Thread(job).start();
48+
job.startIfNotRunning();
5549
}
5650

5751
@Override

0 commit comments

Comments
 (0)