Java 如果重新初始化类,类中的线程会发生什么情况?
如果我有一个Java 如果重新初始化类,类中的线程会发生什么情况?,java,multithreading,class,Java,Multithreading,Class,如果我有一个线程在一个名为菜单的类中运行,那么如果我重新初始化菜单,线程会发生什么情况 public class Menu { private Thread thread = new Thread(new Runnable() { @Override public void run() { while(!thread.isInterrupted()){ // Thread code
线程
在一个名为菜单
的类中运行,那么如果我重新初始化菜单
,线程会发生什么情况
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
}
}
原始初始化中的线程是继续与新线程一起运行还是停止
*虽然我得到了我的答案,但编辑的目的是为了让它更清晰。如果菜单没有启动新线程,那么就没有什么可谈的了。但是,如果
菜单
在线程中执行操作(类似于):
或者可能在构造函数中(不要这样做-导致引用转义导致线程不安全操作):
新生成的线程仍在使用对此对象的引用,即使您更改了创建新实例的引用:
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
}
重新初始化变量
菜单
不会终止线程。线程将一直运行到完成。如本链接所述
只要线程处于活动状态,即它仍在运行代码,那么即使对该线程对象的引用丢失,该线程仍将继续运行。这是由于垃圾回收器的性质,即它不会破坏活动线程(想想为什么即使没有引用,主线程也不会被破坏)
这就是为什么即使丢失了对包含线程的对象的引用(如本例中的“对象”菜单),线程仍将运行,直到完成为止。线程不会“在类中”运行。反过来说,最重要的是。@GurwinderSingh所以每次执行
menu=new menu()
时,会有越来越多的线程运行?告诉我们menu
有什么功能。我可能做了一个错误的假设,你的线在哪里。此代码中的线程在哪里?是否在菜单的构造函数中创建和启动新线程?如果是的话。作为一般规则,顺便说一句,如果那些线程将引用正在构造的对象,那么您不应该从构造函数启动新线程。这不是线程安全的。换句话说,在这里的示例中,如果新启动的线程访问了菜单上的任何实例方法,则可能是不安全的。@yshavit这是正确的。这会导致引用转义。
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
}