Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему виснет Thread? 
:(
    Опции темы
Andrey1
  Дата 23.7.2009, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 27.2.2004
Где: Moscow

Репутация: 1
Всего: 5



Никак не могу осознать глюк. Допустим запускаются два Thread. Если произошел выход в одном из них, нужно завершить и второй (сигнал к выходу храним в forceExitFlag).

Код

    static volatile boolean forceExitFlag = false;

                Thread[] threads = new Thread[2];
                for (final Account account : accounts)
                {
                    Thread aThread = new Thread(new Runnable() {

                        public void run()
                        {
...
                            while (!forceExitFlag)
                            {

                                while (!forceExitFlag && hasNewTask())
                                {
                                    count++;

// do something...
                                    if (!forceExitFlag)
                                    {
                                        try
                                        {
// нужно подождать из-за ограничений...
                                            Thread.sleep(10 * 1000);
                                        } catch (InterruptedException e)
                                        {
...
                                        }
                                    }
                                }
                                forceExitFlag = true;
                            }
                            activeThreads--;
                        }
                    });

                    activeThreads++;
                    threads[activeThreads - 1] = pricesScannerThread;
                    aThread.start();
                }

//                int threadsCount = activeThreads;

                while (activeThreads > 0)
                {
                    Thread.sleep(1000);
                    if (forceExitFlag)
                    {
                        for (Thread t : threads)
                        {
                            if (t != null && !t.isInterrupted())
                            {
                                t.interrupt();
                            }
                        }
                    }
...
                }

На практике t.interrupt(); вначале некоторое время срабатывает ОК, но потом прога зависает не понятно где.

activeThreads оказывается > 0, и один из Thread не завершается.

Это сообщение отредактировал(а) Andrey1 - 23.7.2009, 18:42


--------------------
Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания.
из сутры помоста шестого патриарха Хуэйнена
PM MAIL WWW ICQ   Вверх
can4ec
Дата 24.7.2009, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 25.4.2006

Репутация: 1
Всего: 1



Привет. 

Исходя из того кода что ты выложил твои процессы закцыкливаются в блоке  while (!forceExitFlag && hasNewTask()). Переменная forceExitFlag меняется уже после этого блока. Конечно возможно, что ты ее меняешь в функции hasNewTask(), но кода этой функции тут нету. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.4301 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.