|
0 / 0 / 0
Регистрация: 21.08.2017
Сообщений: 9
|
||||||||||||||||
Как избежать мультизапуска потока?06.09.2017, 12:33. Показов 1970. Ответов 12
Метки нет (Все метки)
Всем привет, я начинающий в JAVA и возможно мой вопрос покажется простым, но не судите строго.
Для примера, делаю кнопку и кидаю в обработчик нажатия такое:
А мне надо чтобы новый поток не запускался до тех пор пока не завершится предыдущий. Делаю так:
тогда делаю так:
В MyRunnable() у меня чтение с инета в буфер, а буфер опустошается по таймеру из другого потока и если там уже мало данных запускается MyRunnable() пополнить буфер, фишка в том, что если какой-то тормоз в сети новый вызов на поток может случится раньше, чем завершиться предыдущий. Вот этого мне и надо избежать, чтобы два потока сразу не пытались читать с инета. В общем, надеюсь на совет.
0
|
||||||||||||||||
| 06.09.2017, 12:33 | |
|
Ответы с готовыми решениями:
12
Как избежать блокировки потока? Как избежать уничтожения потока после выполнения им своей функции? Как избежать блокировки основного UI потока при вызове Thread.Sleep в вспомогательном потоке? |
|
20 / 23 / 24
Регистрация: 20.10.2016
Сообщений: 45
|
|||||||||||
| 06.09.2017, 13:27 | |||||||||||
|
Думаю метод
Добавлено через 11 минут Хотя щас посмотрел внимательнее, у тебя тут вроде всего одна переменная для потока которую ты перезаписываешь, так что возможно и не подойдет. Добавлено через 16 минут Еще твое условие можно объединить в одно вот так:
1
|
|||||||||||
|
46 / 79 / 6
Регистрация: 10.08.2013
Сообщений: 237
|
|
| 06.09.2017, 13:42 | |
|
Почитай про ExecutorService, в частности вам может помочь SingleThreadExecutor.
1
|
|
|
20 / 23 / 24
Регистрация: 20.10.2016
Сообщений: 45
|
|||||||||||
| 06.09.2017, 13:48 | |||||||||||
|
Можно сделать через Executor с одним потоком:
Не по теме: Не заметил ответ выше
1
|
|||||||||||
|
0 / 0 / 0
Регистрация: 21.08.2017
Сообщений: 9
|
||||
| 06.09.2017, 13:55 [ТС] | ||||
|
0
|
||||
|
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
|
|
| 06.09.2017, 14:06 | |
|
я бы тупо блокировал кнопку пока задача выполняется, а по завершении задача через callback делает кнопке что-то типа setEnable(true);
1
|
|
|
0 / 1 / 0
Регистрация: 09.09.2017
Сообщений: 4
|
||||||
| 10.09.2017, 08:22 | ||||||
1
|
||||||
|
0 / 0 / 0
Регистрация: 21.08.2017
Сообщений: 9
|
|
| 11.09.2017, 13:36 [ТС] | |
|
не очень понял логику, если честно.
0
|
|
|
0 / 1 / 0
Регистрация: 09.09.2017
Сообщений: 4
|
||||||
| 11.09.2017, 14:01 | ||||||
|
Попробую объяснить на очень простом языке, практически на пальцах.
1. Допустим у нас есть интерфейс MyRunnableListener, в котором есть метод finishMyRunnable(). 2. В конструктор класса MyRunnable заходит интерфейс MyRunnableListener как параметр. 3. в методе run этого класса, в конце вызывается метод finishMyRunnable интерфейса MyRunnableListener. Этот метод говорит что исполнение потока закончилось. Осталось за малым, реализовать интерфейс MyRunnableListener в любом классе. Для примера я написал класс OnClick. Логика такая: 1. в конструкторе OnClick запускается поток MyRunnable
2. По завершению MyRunnable.run() вызывается метод finishMyRunnable интерфейса MyRunnableListener(в данном случае класс OnClick, метод finishMyRunnable ). 3. Смотрим реализацию MyRunnableListener класса OnClick. В методе finishMyRunnable делаем обработчик. Тут зависит от фантазии - запускаем повторно MyRunnable, - присваиваем значение события какой либо переменной и используем ее в другом коде. Например boolean isFinishThread = true; - как советовали выше делаем кнопку setEnable(true);
0
|
||||||
|
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
|
||
| 11.09.2017, 14:20 | ||
|
rcoma, потому что там этой логики практически нет
лучше не засоряй себе мозги, не вчитывайся в тот код выше - там бреда больше чем здравого смысла
0
|
||
|
0 / 0 / 0
Регистрация: 21.08.2017
Сообщений: 9
|
||
| 11.09.2017, 14:28 [ТС] | ||
|
Другой вопрос, когда логика Runnable в целом подразумевает мультизапуск, но в частных случаях нам надо этого избежать. Пример: В Runnable читаются данные с инета причем в цикле (небольшими порциями). Причем мы можем запустить несколько потоков читая с разных сайтов, но нам нежелательно запускать чтение с одного и того же сайта пока не отработал предыдущий поток чтения с этого сайта.
0
|
||
|
0 / 1 / 0
Регистрация: 09.09.2017
Сообщений: 4
|
||||||
| 11.09.2017, 15:07 | ||||||
|
Я напишу только принцип.
допустим есть где-то List<String>, который хранит URL сайтов(можно так List<URL>, зависит от нужды) с которых идет скачивание данных. Измените интерфейс на
Подправляете логику в классе который запускает MyRunnable и работает с List<String>. Типа если есть url в List<String> то не запускаете MyRunnable с этим Url, а если нет то запускаете. Если MyRunnable запускается то добавляете url в List<String> Как поток закончится, вызываете finishMyRunnable(url), в этом методе реализуете удаление url из List<String> и далее зависит от фантазии и вашей логики. Да, так как у вас многопоточное приложение то List<String> должен быть потокозащищенным, например CopyOnWriteArrayList или используйте synchronized.
0
|
||||||
|
43 / 3 / 3
Регистрация: 02.09.2017
Сообщений: 217
|
|
| 12.09.2017, 20:22 | |
|
Я сам начинающий, но в конструкторах - редакторах игр это делалось просто. Берутся 2 boolean переменные. Например, a и b. Далее переменная a привязывается к кпонке. Переменная b к процессу. Первоначальные значения a = true; b=false. Нажатие на кнопку - a=false, запускается поток и b = true. Пока a = false - нажатие на кнопку невозможно. Поток закончился - b=false, a=true. Кнопка доступна для нажатия.
0
|
|
| 12.09.2017, 20:22 | |
|
Помогаю со студенческими работами здесь
13
Обработать процедуру из другого потока и избежать ошибки "элемент управления создан в другом потоке" Как из потока управлять формой, если функции потока находятся в другом классе? Как из одного потока узнать состояние другого потока VC++6.0, как из порожденного потока прочитать переменную главного потока? Утечка памяти в программе , как избежать или как правильно уничтожить объект? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
1С: Программный отбор элементов справочника Номенклатура по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа.
В качестве фильтра для отбора справочника служит группа номенклатуры.
Отбор под наименованию группы (на. . .
|
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
|
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс.
Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
|
1С: Программный отбор элементов справочника Сотрудники по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа.
В качестве фильтра для отбора служит предопределенное значение перечислений.
Процедура. . .
|
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|