В следующем примере показана проблема в ScheduledExecutorService. Я планирую две задачи «1» и «2», которые выполняются дольше, чем интервал расписания. Задача «2» отправляет другую задачу на выполнение только один раз.
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class TestExecutorFairness {
public static void main(final String[] args) {
final int interval = 200;
final int sleeptime = 600;
final ScheduledExecutorService executor = Executors
.newSingleThreadScheduledExecutor();
// schedule task 1
executor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(sleeptime);
} catch (final InterruptedException e) {
e.printStackTrace();
}
System.out.println("1");
}
}, interval, interval, TimeUnit.MILLISECONDS);
// schedule task 2
executor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(sleeptime);
} catch (final InterruptedException e) {
e.printStackTrace();
}
System.out.println("2");
// submit task 3
executor.submit(new Runnable() {
@Override
public void run() {
System.out.println("3");
}
});
}
}, interval, interval, TimeUnit.MILLISECONDS);
}
}
Результат, который я ожидаю, будет чем-то вроде
1
2
1
2
3
Но так не выполняется. Задача "3" очень долго задерживается, но мне нужно, чтобы она была выполнена как можно скорее.
Есть ли способ изменить это поведение на более справедливое? Или у кого-то есть лучшее решение?