在以下程序中,我把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();
}
}
}
这是为什么?
先谢谢路过每位哥哥姐姐!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();
}
}
}
解决方案 »
- 请问这程序怎么写,需要获取网页上的一个验证码的图片,然后通过一个方法(已经在在,设为X(Image a),然后模拟在网页上的一个文本框中输入,然后获取返回值
- 这个内部类错在哪了?
- 有没有大陆版本的TIJ???
- 谁能给我一个下载地址啊~??
- 如何通过iReport设计report,并且可以灵活的输入查询条件进行查询产生报表
- synchronized method的机锁是什么?
- 倾家荡产求答案:FileReader类和FileInputStream类有什么区别?欢迎大家说出自己对这两个类的理解
- 我在dos 下java命令无效,javac有效?why?
- VAJ3.5的CodeInsight出不来?
- 机械硬盘4k随机读写不是很慢的吗?为什么我测试有100多M/s
- java 新人 有些问题请教
- 关于.sign文件的作用
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也不会出错
改成
System.out.println("睡醒了,t=" + test.t.toString());
test.t只是内存的地址 想让让出现错误显示空指针
要输出该内存的地址所放的值
还有lz 类名大写 规范点
static ok t = new ok();
t只不过是一个引用而已
Thread th = new Thread(t);
这个时候Thread对象里会有一个变量指向t引用的那个对象
你再把t赋值为空后,那个new出来的对象还在存在的,并且由Thread对象里面的某个变量引用,
所有并不会出错