Я знаю, что на этот вопрос ответил много раз, но я изо всех сил пытаюсь понять, как это работает.Редактируемая очередь задач, выполняющихся в фоновом потоке
Так в моем приложении пользователь должен иметь возможность выбрать элементы, которые будут добавлены в очередь (отображается в ListView
с использованием ObservableList<Task>
), и каждый элемент должен быть обработан последовательно с помощью ExecutorService
.
Кроме того, эта очередь должна быть доступна для редактирования (измените порядок и удалите элементы из списка).
private void handleItemClicked(MouseEvent event) {
if (event.getClickCount() == 2) {
File item = listView.getSelectionModel().getSelectedItem();
Task<Void> task = createTask(item);
facade.getTaskQueueList().add(task); // this list is bound to a ListView, where it can be edited
Future result = executor.submit(task);
// where executor is an ExecutorService of which type?
try {
result.get();
} catch (Exception e) {
// ...
}
}
}
Пробовали с executor = Executors.newFixedThreadPool(1)
, но у меня нет контроля над очередью.
Я читал о ThreadPoolExecutor
и очередях, но я изо всех сил пытаюсь понять это, поскольку я совершенно новый для параллелизма.
Мне нужно запустить этот метод handleItemClicked
в фоновом потоке, чтобы пользовательский интерфейс не зависал, как я могу это сделать наилучшим образом?
Подведено: как я могу реализовать очередь задач, которая редактируется и последовательно обрабатывается фоновым потоком?
Пожалуйста, помогите мне понять это
EDIT Используя SerialTaskQueue
класс от vanOekel помог мне, теперь я хочу, чтобы связать список задач моей ListView
.
ListProperty<Runnable> listProperty = new SimpleListProperty<>();
listProperty.set(taskQueue.getTaskList()); // getTaskList() returns the LinkedList from SerialTaskQueue
queueListView.itemsProperty().bind(listProperty);
Очевидно, что это не сработало, поскольку оно ожидает ObservableList. Есть элегантный способ сделать это?
спасибо, что помогло мне. Еще один вопрос: каким образом я могу привязать этот список «List tasks = new LinkedList ();' list к моему «ListView»? –
lenny
@ lenny42 Я не знаком с 'ObservableList', но можете ли вы сделать это наоборот? Используйте что-то вроде 'tasks = FXCollections.observableArrayList()' (см. Http://stackoverflow.com/a/26195354/3080094)? – vanOekel
@ lenny42 Или используйте [ModifiableObservableListBase] (http://docs.oracle.com/javase/8/javafx/api/javafx/collections/ModifiableObservableListBase.html) и используйте обновленную версию 'SerialTaskQueue' в качестве делегата, как показано на рисунке в примере javadoc? – vanOekel