[英]Thread initialized to null in java
public class ThreadState {
public static void main(String[] args){
Thread t = new Thread(){
public void run(){
// infinite loop
while (true) {
try {
Thread.sleep(1000);
}
catch (InterruptedException e) {
}
System.out.println("thread is running..."+Thread.currentThread().toString());
}
}
};
t.start() ;
t = null ;
while (true) {
try {
Thread.sleep(3000);
}
catch (InterruptedException e) {
}
System.out.println("thread is running..."+Thread.currentThread().toString());
}
}
}
线程实例t初始化为null ..仍然可以在控制台上运行并打印其详细信息。 需要对此进行解释
线程实例t初始化为null
不, Thread
变量设置为空值。 变量不是实例-这是值得务必确保你明白这一点。
更改变量的值根本不会影响现有的Thread
对象。
t = null;
只是删除对Thread
实例的引用。
它不会影响线程本身。
特别是,执行的Thread
实例永远不会被GC。
您将t设置为null,它不对线程本身执行任何操作,它只将null分配给存储对实例的引用的变量。
也许这会有所帮助:
如果你这样做会怎么样
Object t = new Thread() {...}
t.start
Thread t2= (Thread)t;
t="Orange";
你会期待魔法事物发生吗? 如果你将t传递给另一个方法而不是在t2中存储另一个引用怎么办?
t只是一个占位符,用于引用该线程,为t分配的东西对线程的影响与对下面的分配null的数字2的影响一样大。
Integer a = 2;
a=null;
@JonSkeet和其他人已经解释说,你设置t = null
你根本没有改变正在运行的Thread
,你只是改变变量t
。 一旦线程启动,JVM就会管理线程,所以即使没有引用它,它仍然会运行而不是GC。
需要指出的另一点是,在接下来的循环中,您正在执行以下操作:
System.out.println("thread is running..."+Thread.currentThread().toString());
这不会打印出您刚刚分叉的线程的状态,而是打印出当前线程 - 执行分叉的线程。 这是运行main()
方法的“主线程”。 主线程可以完成,你分叉的线程将继续运行 - 防止JVM退出。 只有当您分叉的线程被标记为守护程序线程时,JVM才会在主线程完成时完成。
我认为Jon是正确的,即“改变变量的值根本不会影响现有的Thread对象。”
但你需要的实际解释是
在编程方法中,使用线程本地的静态或全局内存。 因为通常进程中的所有线程共享相同的地址空间,这有时是不合需要的。 换句话说,当来自同一进程的线程引用时,静态或全局变量中的数据通常总是位于相同的存储器位置。 每个线程都有自己的堆栈。
希望给出的概念解释是有帮助的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.