6.2.3 Thread类的更新
Java 7对于表示线程的类java.lang.Thread也做了一些更新,这些更新主要明确了Thread类的对象在某些情况下的行为,并且去掉了之前使用中比较模糊的和设计不合理的部分。首先将Thread类的clone方法改为总是抛出CloneNotSupportedException异常,这是因为对一个Thread类的对象进行克隆是没有意义的。Java 7显式地禁止了对Thread类对象的克隆操作。其次,在Java 7之前,Thread类的join方法和sleep方法可以接收一个long类型的参数表示等待的时间,但是并没有定义当这个参数值为负数时的处理方式。Java 7中规定:如果这两个方法的等待时间参数的值为负数,则会抛出IllegalArgumentException异常。
另外一个明确了参数处理行为的是Thread类的构造方法。在创建Thread类的对象时可以使用的参数包括:表示Thread类的对象所在线程组的java.lang.ThreadGroup类的对象,表示需要运行的任务的java.lang.Runnable接口的实现对象,以及表示线程名称的String类的对象。如果传入的ThreadGroup类的对象为null,那么会先尝试调用当前配置好的安全管理器(java.lang.SecurityManager类的对象)的getThreadGroup方法来获取ThreadGroup类的对象;如果没有配置安全管理器或getThreadGroup方法也返回null,那么会使用当前线程所在线程组的ThreadGroup类的对象;如果传入的Runnable接口的实现对象为null,那么会调用Thread类的对象本身的run方法;如果传入的线程名称是null,会抛出NullPointerException异常。
在调用Thread类的setContextClassLoader方法来设置线程上下文类加载器时,如果传入的参数为null,则表明使用的是系统类加载器。如果无法使用系统类加载器,就使用启动类加载器。同样的,如果当前线程上下文类加载器是系统类加载器或启动类加载器,那么getContextClassLoader方法的返回值是null。关于类加载器的更多介绍,请见第9章。