Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果重新初始化类,类中的线程会发生什么情况?_Java_Multithreading_Class - Fatal编程技术网

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
}