Если вы хотите, чтобы пользователи не пытались запускать Service
два или более раз одновременно, просто отключите все узлы пользовательского интерфейса, которые запускают Service
во время его работы.Один из способов сделать это - связать свойство disable
Node
со свойством running
Service
.
Если вы хотите поставить в очередь выполнение, то это зависит от того, что Service
требуется.Например, нужен ли какой-либо вклад?Если нет, просто используйте переменную requests
и увеличивайте / уменьшайте ее по мере необходимости.
public class Controller {
private int requests;
private Service<Object> service = new Service<>() {
@Override
protected Task<Object> createTask() {
// create and return Task...
}
@Override
protected void succeeded() {
if (requests > 0) {
requests--;
restart();
}
}
};
@FXML
private void startService() {
if (service.isRunning()) {
requests++;
} else {
service.start();
}
}
}
Если Service
(или, более конкретно, Task
) действительно требуется ввод, который вы все равно делаетечто-то похожее.Однако вместо использования int
для отслеживания количества запросов вы бы использовали Queue
(или какой-либо другой подобный объект), который содержит необходимую информацию для каждого Task
.Когда Service
завершится и Queue
не будет пустым, перезапустите Service
и возьмите следующий элемент.