在以下程序中,我把Thread th = new Thread(t);其中的t置空了,按我的理解,t被置空后,指向t的对象不存在了,进程应该会出错,但是事实上没有报错。
   这是为什么?
   先谢谢路过每位哥哥姐姐!import java.util.Vector;
public class test {
static ok t = new ok(); public static void main(String[] args) {
Thread th = new Thread(t);
th.start();
}
}class ok implements Runnable { @Override
public void run() {
System.out.println("进入线程");
test.t = null; //把进程本身的目标对象置空了
try {
Thread.sleep(3000);
System.out.println("睡醒了,t=" + test.t);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

解决方案 »

  1.   

    javadoc里说的很清楚了Thread
    public Thread(ThreadGroup group,
                  Runnable target,
                  String name)分配新的 Thread 对象,以便将 target 作为其运行对象,将指定的 name 作为其名称,并作为 group 所引用的线程组的一员。 
    如果 group 为 null,并且有安全管理器,则该组由安全管理器的 getThreadGroup 方法确定。如果 group 为 null,并且没有安全管理器,或安全管理器的 getThreadGroup 方法返回 null,则该组与创建新线程的线程被设定为相同的 ThreadGroup。 如果有安全管理器,则其 checkAccess 方法通过 ThreadGroup 作为其参数被调用。 此外,当被重写 getContextClassLoader 或 setContextClassLoader 方法的子类构造方法直接或间接调用时,其 checkPermission 方法通过 RuntimePermission("enableContextClassLoaderOverride") 权限调用。其结果可能是 SecurityException。 如果 target 参数不是 null,则 target 的 run 方法在启动该线程时调用。如果 target 参数为 null,则该线程的 run 方法在该线程启动时调用。 新创建线程的优先级被设定为创建该线程的线程的优先级,即当前正在运行的线程的优先级。方法 setPriority 可用于将优先级更改为一个新值。 当且仅当创建新线程的线程当前被标记为守护线程时,新创建的线程才被标记为守护线程。方法 setDaemon 可用于改变线程是否为守护线程。 
    参数:
    group - 线程组。
    target - 其 run 方法被调用的对象。
    name - 新线程的名称。 
    抛出: 
    SecurityException - 如果当前线程无法在指定的线程组中创建线程,或者无法重写上下文类加载器方法。
    另请参见:
    Runnable.run(), run(), setDaemon(boolean), setPriority(int), ThreadGroup.checkAccess(), SecurityManager.checkAccess(java.lang.Thread)所以test.t=null了,th也不会出错
      

  2.   

    这里System.out.println("睡醒了,t=" + test.t);
    改成
    System.out.println("睡醒了,t=" + test.t.toString());
    test.t只是内存的地址   想让让出现错误显示空指针 
    要输出该内存的地址所放的值
    还有lz   类名大写 规范点
      

  3.   

    对象存在啊,只是它的值为Null而已
      

  4.   

    好长哈  没看,不过线程的作用是为了执行任务,即使里面是null 那也没问题,线程是空的拉。你想想线程池, 本来就是创建一堆空的线程,当有任务来, 去执行,没任务的话就绪放空。
      

  5.   

    不会出错
    static ok t = new ok();
    t只不过是一个引用而已
    Thread th = new Thread(t);
    这个时候Thread对象里会有一个变量指向t引用的那个对象
    你再把t赋值为空后,那个new出来的对象还在存在的,并且由Thread对象里面的某个变量引用,
    所有并不会出错