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 ..仍然可以在控制台上运行并打印其详细信息。需要对此进行解释
答案 0 :(得分:11)
线程实例t初始化为null
不,Thread
变量设置为空值。变量不是实例 - 值得让完全确保你理解它。
更改变量的值根本不会影响现有的Thread
对象。
答案 1 :(得分:5)
t = null;
只删除对Thread
实例的引用
它不会影响线程本身。
特别是,执行Thread
实例永远不会被GC。
答案 2 :(得分:1)
你将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;
答案 3 :(得分:1)
@JonSkeet和其他人已经解释说,然后你设置t = null
你根本没有改变正在运行的Thread
,你只是在改变变量t
。一旦线程启动,JVM就会管理线程,所以即使没有引用它,它仍然会运行而不是GC。
另一点需要指出的是,在接下来的循环中,你正在做:
System.out.println("thread is running..."+Thread.currentThread().toString());
这是不打印出您刚刚分叉的线程的状态,而是打印出当前线程 - 执行分叉的线程。这是运行main()
方法的“主线程”。主线程可以完成,你分叉的线程将继续运行 - 防止JVM退出。只有当您分叉的线程被标记为守护程序线程时,JVM才会在主线程完成时完成。
答案 4 :(得分:0)
我认为Jon是正确的,即“改变变量的值根本不会影响现有的Thread对象。”
但您需要的实际解释是
在使用线程本地静态或全局内存的编程方法中。 因为通常进程中的所有线程共享相同的地址空间,这有时是不合需要的。 换句话说,当来自同一进程的线程引用时,静态或全局变量中的数据通常总是位于相同的存储器位置。每个线程都有自己的堆栈。
希望给出的概念性解释是有帮助的。