Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Design, Quality, Testing > JUnit и TestNG: main exit -> JVM exit


Автор: MaxPayneC 16.6.2010, 09:27
Существует метод, который создает несколько потоков. Эти потоки работают долго и мучительно, очень долго и очень мучительно smile Если написать юнит-тест, с использованием двух фреймворков из сабжа, то JVM завершает работу, когда завершается main. Есть идеи, как с этим бороться, лучше чем вставить в код теста
Код

        boolean isParsersActive;
        do
        {
            Thread.sleep(2000);
            Thread[] threads = new Thread[Thread.activeCount() + 5];
            int threadAmount = Thread.enumerate(threads);
            isParsersActive = false;
            for (int i = 0; i < threadAmount; ++i)
            {
                if (threads[i].getName().startsWith("Parser"))
                {
                    isParsersActive = true;
                    break;
                }
            }
        }
        while (isParsersActive);

?

Автор: powerOn 16.6.2010, 10:02
Если я правильно понял проблему, то из теста запускается новый поток, который неуспевает завершится полностью, поскольку тестовый фреймворк завершает выполнение JVM? Если так, то можно прижойниться к текушей нити:

Код

        try {
            Runnable runnable = new Runnable()
            {
                public void run()
                {
                    for (int i = 0; i < 10; i++) {
                        try {
                            System.out.println("Count = " + i);
                            Thread.sleep(2000);
                        } catch (InterruptedException ex) {
                            ex.printStackTrace();
                        }
                    }
                }
            };
            Thread thread = new Thread(runnable);
            thread.start();
            thread.join();
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }




Автор: MaxPayneC 16.6.2010, 10:43
powerOn, Почти так. В тесте вызывается метод, который плодит много потоков. Этот метод не дожидается завершения выполнения всех потоков, им созданных. Вообще, я уже понял что нужно использовать join smile Но если мы предположим, что я этого не понял, есть способ заставить тестРаннер ждать завершения всех Runnable?

Автор: powerOn 16.6.2010, 14:15
Честно говоря, никогда не слышал о подобных настройках в тестовых фреймвёрках. Мне кажется такие ситуации сложно отследить автоматически, ведь одна нить в зависимости от логики может запускать еще несколько, те еще несколько и т.д., а дождаться нужно выполнения всех. Т.е. join в данном случае естественный вариант.

Автор: MaxPayneC 16.6.2010, 14:19
Вполне логично, и собственно как я и думал. Благодарю.

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