如果我在名为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
}
}
原始初始化中的线程是否继续与新线程一起运行还是停止?
*虽然我得到了答案,但我试图让它更清晰。
答案 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,该线程仍然会一直运行直到它完成。