如果重新初始化类,线程中的线程会发生什么?

时间:2016-12-25 04:23:34

标签: java multithreading class

如果我在名为Thread的类中运行了Menu,那么如果我要重新初始化Menu,线程会发生什么?

public class Menu {
    private Thread thread = new Thread(new Runnable() {

        @Override
        public void run() {
            while(!thread.isInterrupted()){
                // Thread code
            }   
        }
    });

    public Menu() {
        thread.start();
    }

    public static void main(String[] args) {
        Menu menu = new Menu(); //Original
        menu = new Menu(); // New
    }

}

原始初始化中的线程是否继续与新线程一起运行还是停止?

*虽然我得到了答案,但我试图让它更清晰。

2 个答案:

答案 0 :(得分:2)

如果菜单没有启动新线程,那么没有什么可谈的。但是,如果Menu在线程中执行某些操作(类似):

void doStuff() {
    new Thread(()->{
    //do work here
    }).start();
}

或者可能在构造函数中(不要这样做 - 导致引用转义导致线程不安全的操作)本身:

Menu() {
  //create a thread here
}

即使您更改了创建新实例的引用,新生成的线程仍在使用对此对象的引用:

public static void main(String[] args) {
    Menu menu = new Menu();//initialize --> spawned a new thread here
    menu.doStuff();  // --> or here depending on where you did it
    int x = menu.getNumbers;
    menu = new Menu(); //reinitialize
}

重新初始化变量menu不会杀死线程。线程将运行完成。

答案 1 :(得分:-1)

正如此链接Java Thread Garbage collected or not

中所述

只要一个线程处于活动状态,意味着它仍在运行代码,那么即使对该线程对象的引用丢失,该线程仍将继续运行。这是由于垃圾收集器的性质,它不会破坏活动线程(想想为什么主线程永远不会被破坏,即使没有引用)。

这就是为什么即使你丢失了对其中包含一个线程的对象的引用,比如你的情况下的对象Menu,该线程仍然会一直运行直到它完成。