Если вам нужно выполнять все запросы, кроме определенного количества потоков, вы можете использовать пул потоков и позволить исполнителю управлять очередью.
private ExecutorService services;
private final static int POOL_SIZE = 1;
public MessagesService(){
services = Executors.newFixedThreadPool(POOL_SIZE);
}
public void scheduleMessages(Runnable r){
services.submit(r);
}
Если вы вызовете addCall
x раз, x thread будет выполнен в конце, но никогда не будет использовать больше, чем количество потоков, доступных в пуле. Здесь 1 тема.
Для системы, которая принимает только один запрос, вы можете использовать тот же подход, но проверить Future
, возвращенный одним исполнителем потока. Таким образом, вы можете проверить статус услуги.
private ExecutorService services;
private Future<?> lastCall;
public MessagesService() {
services = Executors.newSingleThreadExecutor();
lastCall = null;
}
public synchronized void scheduleMessages(Runnable r) {
if(!isScheduled()){
lastCall = services.submit(r);
}
}
public boolean isScheduled(){
return lastCall != null && !lastCall.isDone();
}
Таким образом, Runnable
не нужно обновлять флаг, который дает повторно используемое решение.
Вот пример Runnable
для проверки этих кодов:
new Runnable() {
System.out.println("Running");
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
}