Почему не могу разбудить эту ветку

Я хочу протестировать метод Thread.sleep() и обнаружил интересную вещь. Когда я вызываю метод main(), консоль выводит «UserA sleep...» и «UserA waking...», это означает, что программа пробуждается, но когда я использую метод junit для запуска того же кода, что и метод main(), он не печатает «UserA waking...»… Буду признателен, если кто-нибудь объяснит это.

package com.lmh.threadlocal;

import org.junit.Test;

public class ThreadTest {

    public static void main(String [] args) {
        new Thread(new UserA()).start();
    }
    @Test
    public void testWakeup(){
        new Thread(new UserA()).start();
    }

}

class UserA implements Runnable{
    @Override
    public void run() {
        try {
            System.out.println("UserA sleeping...");
            Thread.sleep(1000);
            System.out.println("UserA waking...");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

person Crowley    schedule 24.08.2013    source источник
comment
Можете ли вы добавить дополнительные операторы отладки в начале и в конце testWakeup . Мол, в начале - Создание новой темы.   -  person bsd    schedule 24.08.2013
comment
но почему вызов метода main() не должен просыпаться ???   -  person Crowley    schedule 24.08.2013
comment
Как вы проводите тест JUnit? Я подозреваю, что это как-то связано с тестом JUnit runner; например он мог звонить System.exit() вскоре после возвращения из testWakeup. Или это может быть убийство дочерних потоков... хотя я думаю, что это маловероятно.   -  person Stephen C    schedule 24.08.2013


Ответы (1)


Я предполагаю, что JUnit разрывает тест до завершения сна, потому что поток выполнения теста выходит из тестового метода до завершения сна. Пытаться

@Test
public void testWakeup() throws Exception {
    Thread t = new Thread(new UserA());
    t.start();
    t.join();
}
person sjr    schedule 24.08.2013
comment
Если поток не является потоком демона, он также должен печатать, я прав? - person jamee; 24.08.2013
comment
Этот ответ на самом деле не объясняет, как/почему снос останавливает второй println... - person Stephen C; 24.08.2013
comment
@StephenC прав, хотя это сработает, я все еще немного смущен, почему он останавливает второй println . - person Crowley; 24.08.2013