Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Почему виснет Thread?


Автор: Andrey1 23.7.2009, 18:40
Никак не могу осознать глюк. Допустим запускаются два 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 не завершается.

Автор: can4ec 24.7.2009, 11:02
Привет. 

Исходя из того кода что ты выложил твои процессы закцыкливаются в блоке  while (!forceExitFlag && hasNewTask()). Переменная forceExitFlag меняется уже после этого блока. Конечно возможно, что ты ее меняешь в функции hasNewTask(), но кода этой функции тут нету. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)