Почему основной поток здесь не прерывается? - PullRequest
0 голосов
/ 04 июня 2018
public class SingletonClass {
private static SingletonClass singletonClass;
public void executeMethod(String string) {
    System.out.print("["+string);
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println("]");
}
private SingletonClass() {

}
public static SingletonClass getInstance() {
    if(singletonClass==null)
        singletonClass=new SingletonClass();
    return singletonClass;
}

public static void main(String args[]) {
    SingletonClass.getInstance().executeMethod("MainThread");
    new SingleTonThread(SingletonClass.getInstance());
}

}

class SingleTonThread implements Runnable{
private SingletonClass sc;
SingleTonThread(SingletonClass singleton){
    this.sc=singleton;
    Thread t = new Thread(this);
    t.start();
}
@Override
public void run() {
    sc.executeMethod("SingleTonThread");
}

}

Я ожидал следующий вывод (так как основной поток должен быть вытеснен SingleTonThread): ожидается Выход: [MainThread [SingleTonThread]] Фактический вывод:[MainThread] [SingleTonThread]

1 Ответ

0 голосов
/ 04 июня 2018

При вызове:

SingletonClass.getInstance().executeMethod("MainThread");

вы заблокировали основной поток, вызвав

sleep(1000)

Следующая строка, инициирующая класс потока, не будет выполняться до тех пор, пока

executeMethod("MainThread")

Завершит выполнение

Кстати, это очень плохая практика - запускать поток в конструкторе , как описано в этом вопросе

...