powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JavaFX: действия при старте и завершении потоков.
8 сообщений из 8, страница 1 из 1
JavaFX: действия при старте и завершении потоков.
    #38683651
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то уже задавал тут вопрос о том, как вообще определяется, что все работающие Service завершились, но ответа не получил :)

Вопрос тогда звучал так:
Возник вопрос: а как вообще по-правильному определять, что все потоки (task'и или service'ы) завершились ?
Самый простой пример: при открытии формы показываем пользователю либо анимированную картинку, либо выводим надпись "Ждите, загрузка..." и одновременно с этим запускаем несколько фоновых задач. По их окончанию надо надпись\картинку убрать, а как определять, что все задачи завершились ?

В мой нубский ум приходит только одна мысль - это создание доп. класса, который бы принимал в конструктор кол-во запущенных потоков, а каждый из запущенных потоков при завершении увеличивал бы некую переменную на единицу. И соответственно когда эта переменная становилось бы равной количеству потоков, то выполнялись бы необходимые действия.

В общем возникла все-таки необходимость все это реализовать, и получился такой вот класс.
Посмотрите пожалуйста, насколько все это жизнеспособно и корректно сделано. Заранее благодарю!

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
public class MyThreadCountService
    extends Service<Void> {

    /*  Время "сна" потока  */
    private final int THREAD_SLEEP_TIME = 100;

    /*  Переменная, которую будут увеличивать потоки при своем завершении  */
    private volatile int endedThreadsCount;

    /*  Общее число одновременно работающих потоков  */
    private int allWorkingThreadsCount;

    /*  Картинка с анимацией  */
    private ImageView imageView;

    public MyThreadCountService(ImageView imageView) {
        setEndedThreadsCount(0);
        setAllWorkingThreadsCount(0);

        setImageView(imageView);

        this.setOnCancelled(e -> setEndedThreadsCount(0));
    }

    public void setAllWorkingThreadsCount(int allWorkingThreadsCount) {
        this.allWorkingThreadsCount = allWorkingThreadsCount;
    }

    private int getAllWorkingThreadsCount() {
        return allWorkingThreadsCount;
    }

    private void setImageView(ImageView imageView){
        this.imageView = imageView;
    }

    private ImageView getImageView() {
        return imageView;
    }

    public void incEndedThreadsCount() {
        this.endedThreadsCount++;
    }

    private void setEndedThreadsCount(int endedThreadsCount) {
        this.endedThreadsCount = endedThreadsCount;
    }

    private int getEndedThreadsCount() {
        return this.endedThreadsCount;
    }

    @Override
    protected Task<Void> createTask() {
        return new Task<Void>() {
            @Override
            protected Void call() throws Exception {
                Platform.runLater(() -> getImageView().setVisible(true));
                    while(true) {
                            /*  Если отменяем выполнение или число завершившихся потоков равно ранее установленному - останавливаем цикл  */
                            if(isCancelled() || getEndedThreadsCount() == getAllWorkingThreadsCount()){
                                Platform.runLater(() -> getImageView().setVisible(false));
                                break;
                            }
                        Thread.sleep(THREAD_SLEEP_TIME);
                    }
                return null;
            }
        };
    }
}
...
Рейтинг: 0 / 0
JavaFX: действия при старте и завершении потоков.
    #38683663
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korshunКак-то уже задавал тут вопрос о том, как вообще определяется, что все работающие Service завершились, но ответа не получил :)
Вы зациклились на JavaFX API, игнорируя при этом j.c.u. Зачем брать именно Service для этой проблемы? Используйте Task.get() в итераторе. Вроде, классический пример. Зачем что-то изобретать?

korshunВ мой нубский ум приходит только одна мысль - это создание доп. класса, который бы принимал в конструктор кол-во запущенных потоков, а каждый из запущенных потоков при завершении увеличивал бы некую переменную на единицу. И соответственно когда эта переменная становилось бы равной количеству потоков, то выполнялись бы необходимые действия.
Можно и так. У меня так сделано в Swing, но немного для другой задачи. Просто это сложнее. А зачем усложнять, если есть решение проще?
...
Рейтинг: 0 / 0
JavaFX: действия при старте и завершении потоков.
    #38683668
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korshun
Код: java
1.
2.
3.
4.
5.
    private volatile int endedThreadsCount;

    public void incEndedThreadsCount() {
        this.endedThreadsCount++;
    }



REALLY? Фраза "атомарная операция" вам о чем-либо говорит?
Возможно метод должен вызываться только из EDT? Тогда нужно в нем явную проверку реализовать и выкидывать исключение для других потоков.
...
Рейтинг: 0 / 0
JavaFX: действия при старте и завершении потоков.
    #38683688
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczREALLY? Фраза "атомарная операция" вам о чем-либо говорит?
Возможно метод должен вызываться только из EDT? Тогда нужно в нем явную проверку реализовать и выкидывать исключение для других потоков.
А что не так ? Можно чуток подробнее для чайников ?:)
Ибо например здесь пишут следующее:
volatile проще, нежели синхронизация и подходит только для контроля доступа к одиночному экземпляру или переменной примитивного типа: int, boolean... Когда переменная объявлена как volatile, любая запись её будет осуществляться прямо в память, минуя кеш. Также как и считываться будет прямо из памяти, а не из всевозможного кеша. Это значит, что все потоки будут "видеть" одно и то же значение переменной одновременно.

BlazkowiczЗачем брать именно Service для этой проблемы?
Так если мне нужно "считать" потоки множество раз, то предположил, что лучше юзать Service, чем каждый раз создавать новый Task, разве нет ?
...
Рейтинг: 0 / 0
JavaFX: действия при старте и завершении потоков.
    #38683700
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korshunА что не так ? Можно чуток подробнее для чайников ?:)

Подробнее? Гугл - "атомарные операции".
Два потока читают переменную - видят там 0. Увеличивают на 1. Записывают в переменную 1. Два потока отработали. А в переменной 1.


korshunИбо например здесь пишут следующее:

Ну, если один поток увидел 0, то и второй поток увидел 0. Всё честно. На инкремент это как должно влиять?

korshunТак если мне нужно "считать" потоки множество раз, то предположил, что лучше юзать Service, чем каждый раз создавать новый Task, разве нет ?
Каша в термнологии и в постановке задачи. Вот написано:
"как вообще определяется, что все работающие Service завершились"
Да, никак. Потому что работают и завершаются Task-и. А Service это лишь инструмент для работы с ними.
...
Рейтинг: 0 / 0
JavaFX: действия при старте и завершении потоков.
    #38683741
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczПодробнее? Гугл - "атомарные операции".
Два потока читают переменную - видят там 0. Увеличивают на 1. Записывают в переменную 1. Два потока отработали. А в переменной 1.
Угу, уже дошло до меня в чем ошибка, спасибо.
Подскажите тогда пожалуйста, как правильно инкрементить volatile переменную, в интернетах что-то примеры найти не могу :(
...
Рейтинг: 0 / 0
JavaFX: действия при старте и завершении потоков.
    #38683748
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
JavaFX: действия при старте и завершении потоков.
    #38683792
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, спасибо!
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JavaFX: действия при старте и завершении потоков.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]