Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2

Почему когда фоновый thread "спит" я не могу убить main thread ?

24.05.2012, 11:44. Показов 2027. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет!
Делаю гуй на swing'e, для реализации долговременной задачи создал второй поток. В этом втором потоке вызывается Thread.sleep(msec). Почему когда этот поток спит, я не могу закрыть окно приложения? Как будто sleep() вызывается в главном потоке.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.05.2012, 11:44
Ответы с готовыми решениями:

Exception in thread "main" Exception in thread "Thread-0" java.lang.ExceptionInInitializerError
Подскажите, пожалуйта - подхватываю в NetBeans распакованный jar. Прога нормально запускается. Как только я создаю в проекте пакет и в...

Многопоточность: когда и почему лучше использовать thread или async?
Подскажите, пожалуйста, когда и почему лучше использовать thread или async?

Убить thread, вызвавший ошибку
Всем привет! Есть ли способ убить thread, вызвавший FloatingPointException в multi-thread проекте, не убивая всю application ?

13
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
24.05.2012, 12:31
как запускается поток в котором слип?
ну и вообще приятнее говорить когда видно код
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
24.05.2012, 17:29  [ТС]
Цитата Сообщение от mutagen Посмотреть сообщение
ну и вообще приятнее говорить когда видно код
Да, полностью согласен. Просто писал с другого компа, не было кода под рукой. По-позже выложу.

Добавлено через 2 часа 17 минут
Вот код, по памяти написать не мог, т.к. соверешенно на знаю java
вот так создаю и запускаю поток при нажатии на кнопку
Java
1
2
3
4
5
6
7
8
private class startButtonListener implements ActionListener {
     public void actionPerformed (ActionEvent e)
     {             
     /* some code */  
          Thread thread = new Thread(new MovingTest());
          thread.start();
      }
}
вот так выглядет MovingTest()
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private class MovingTest implements Runnable {
 
     public void run()
     {
         /* some code */
         try {
             SwingUtilities.invokeAndWait(new Runnable() {
                 public void run()
                 {
                     // тут меняю GUI
                     /* some code */
                     try {
                         Thread.sleep(timeToSleep);
                      } catch (InterruptedException ignored) {
                          System.out.println("Exception");
                      }
                  }
               }
           }
      }
}
если timeToSleep например сделать 10000 (10 сек), то пока поток спит, окно приложения не реагирует на действия пользователя. При незначительном значении timeToSleep (например 100 мс) это незаметно, но все равно хочется сделать правильно.
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
24.05.2012, 18:45
Воспользуйтесь invokeLater, вместо invokeAndWait
и не делайте трид в триде а просто
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
private class startButtonListener implements ActionListener {
     public void actionPerformed (ActionEvent e)
     {             
     /* some code */  
         SwingUtilities.invokeLater(new MovingTest());
      }
}
private class MovingTest implements Runnable {
 
     public void run()
     {
         /* some code */
      
                     // тут меняю GUI
                     /* some code */
                     try {
                         Thread.sleep(timeToSleep);
                      } catch (InterruptedException ignored) {
                          System.out.println("Exception");
                      }
                  
               
           
      }
}
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
24.05.2012, 18:53  [ТС]
Воспользуйтесь invokeLater, вместо invokeAndWait
Тогда моя программа не корректно работает. Мне нужно, чтоб GUI изменялся именно тогда, когда я написал. А при использовании invokeLater он может измениться немного позже. когда строка для вывода уже изменилась (у меня там строка выводится).

Цитата Сообщение от mutagen Посмотреть сообщение
и не делайте трид в триде а просто
Я задание для ВУЗа делаю, мне по условию задания нужно Thread использовать.
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
24.05.2012, 19:03
Цитата Сообщение от Kastaneda Посмотреть сообщение
Тогда моя программа не корректно работает. Мне нужно, чтоб GUI изменялся именно тогда, когда я написал.

А при использовании invokeLater он может измениться немного позже. когда строка для вывода уже изменилась (у меня там строка выводится).
Я задание для ВУЗа делаю, мне по условию задания нужно Thread использовать.
1. но у вас полюбому вывод завязан на EDT http://www.ibm.com/developerwo... tion4.html, поэтому когда что рисовать не зависит от вас
2. ну через инвокер можно запустить и Трид а в ней оверлоднуть рун, поэтому институт будет не против

ну и ещё у вас мемори лик возможен, так как вы по нажатию кнопки поток стартуете, а представьте кликающего непрерывно по кнопке пользователя
1
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
24.05.2012, 20:49  [ТС]
Цитата Сообщение от mutagen Посмотреть сообщение
ну и ещё у вас мемори лик возможен
Эмм, я думал в Java отсутствует такое понятие как memory leak.
Цитата Сообщение от mutagen Посмотреть сообщение
ну через инвокер можно запустить и Трид а в ней оверлоднуть рун
Т.е. можно будет менять GUI прям в run'е треда?

Добавлено через 4 минуты
Цитата Сообщение от mutagen Посмотреть сообщение
а представьте кликающего непрерывно по кнопке пользователя
Да проблема решается выносом объекта Thread в private область главного класса. Сделать его равным null и по завершению работы треда опять делать его равным null. А перед запуском проверять, является ли он null, если нет, то не запускать новый thread.

Не по теме:

или, как говорит наш ведущий программист, юзер может и экзешник удалить, мы не должны об этом думать:)

0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
24.05.2012, 20:50
Цитата Сообщение от Kastaneda Посмотреть сообщение
Эмм, я думал в Java отсутствует такое понятие как memory leak.

Т.е. можно будет менять GUI прям в run'е треда?
1.В яве есть gc не уберёт за вами пока вы не удалите все ссылки на обьект или не выйдете из зоны видимости метода, но если у вас в триде нет завершения или продолжительные действия, то гс не может ничем помочь.
2.да
1
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
24.05.2012, 20:51  [ТС]
Цитата Сообщение от mutagen Посмотреть сообщение
2.да
Пожалуй так и сделаю. Спасибо!
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
24.05.2012, 20:52
Цитата Сообщение от Kastaneda Посмотреть сообщение
Да проблема решается выносом объекта Thread в private область главного класса. Сделать его равным null и по завершению работы треда опять делать его равным null. А перед запуском проверять, является ли он null, если нет, то не запускать новый thread.
ну это можно просто решить синглетоном с ленивой инициализацией, ну и с реакцией на кнопку через методы
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
24.05.2012, 20:58  [ТС]
А все же вопрос из названия темы интересен - почему так происходит? По логике ведь должно работать.

Добавлено через 2 минуты

Не по теме:

Цитата Сообщение от mutagen Посмотреть сообщение
ну это можно просто решить синглетоном с ленивой инициализацией, ну и с реакцией на кнопку через методы
Ну можно и так, только я потом в жизни не объясню это человеку, которому я пишу работу:) Для себя я по-масштабней курсовик пишу.

0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
24.05.2012, 21:08
Цитата Сообщение от Kastaneda Посмотреть сообщение
почему так происходит?
так как ты вызвал invokeAndWait то основной поток EDT стартует твой трид и ждёт завершения с блокировкой, ну а там слип какраз )))

Не по теме:

The invokeAndWait() method is just like invokeLater(), except that invokeAndWait() doesn't return until the event-dispatching thread has executed the specified code. Whenever possible, you should use invokeLater() instead of invokeAndWait(). If you use invokeAndWait(), make sure that the thread that calls invokeAndWait() does not hold any locks that other threads might need while the call is occurring.



ну а так как вся отрисовка через EDT, то ты её просто заморозил
1
636 / 528 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
25.05.2012, 11:17
Странно, что никто не дал ссылки и .
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
25.05.2012, 11:51
Цитата Сообщение от aleksandy Посмотреть сообщение
Странно, что никто не дал ссылки и .
эта тема паралельна другой от ТС, а там уже их выдавали, просто видимо многабукаф
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.05.2012, 11:51
Помогаю со студенческими работами здесь

Как убить std::thread?
К сожалению мне так и не удалось найти информацию о том, как корректно убить std::thread в случае необходимости. Как правило, предлагают...

Не могу разобраться с exception in thread "main" java.lang.nullpointerexception
Заменить k-й символ слова на заданный символ. С использованием классов Word и Sentence. Eclipse выдает Exception in thread...

Exception in thread "main" java.lang.NullPointerException at Main.main
Извините, перемещю в нужный раздел как только найду как это сделать Задание: Создать масив объектов класса, определить значение полей...

Telethon ошибка RuntimeError: There is no current event loop in thread 'Thread-2 (process_request_thread)'
Всем привет! Есть файл с классом парсера, который использует телетон. При вызове сталкиваюсь с ошибкой. Плохо понимаю асинхронность и...

Непонятки в Java. Chain method call. Thread.start() vs Thread.run()
Ребят, кто знает подскажите, изучаю Java уже 4 месяца, а до меня все не доходит вот к примеру такая запись, ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru