关键属性
- name
表示Thread的名字, 可以通过Thread类的构造器中的参数来指定线程名字
- priority
线程的优先级(最大值为10,最小值为1,默认值为5)
- daemon
线程是否是守护线程,如果在main线程中创建了一个守护线程,当main方法运行完毕之后,守护线程也会随着消亡。在JVM中,垃圾收集器线程就是守护线程
- target
要执行的任务
- group
线程群组
关键方法
- start
start()用来启动一个线程,当调用start方法后,系统才会开启一个新的线程来执行用户定义的子任务,在这个过程中,会为相应的线程分配需要的资源
- run
run()方法是不需要用户来调用的,当通过start方法启动一个线程之后,当线程获得了CPU执行时间,便进入run方法体去执行具体的任务。注意,继承Thread类必须重写run方法,在run方法中定义具体要执行的任务
- sleep
有2个重载版本
public static native void sleep(long millis) throws InterruptedException; public static void sleep(long millis, int nanos) throws InterruptedException;
sleep让线程睡眠,交出CPU,让CPU去执行其他的任务。 sleep方法不会释放锁,也就是说如果当前线程持有对某个对象的锁, 则即使调用sleep方法,其他线程也无法访问这个对象。 sleep方法相当于让线程进入阻塞状态。
- yield
调用yield方法会让当前线程交出CPU权限,让CPU去执行其他的线程。 它跟sleep方法类似,同样不会释放锁。 但是yield不能控制具体的交出CPU的时间, 另外,yield方法只能让拥有相同优先级的线程有获取CPU执行时间的机会。 注意,调用yield方法并不会让线程进入阻塞状态, 而是让线程重回就绪状态,它只需要等待重新获取CPU执行时间, 这一点是和sleep方法不一样的。
- join
有三个重载版本
join() join(long millis) //参数为毫秒 join(long millis,int nanoseconds) //第一参数为毫秒,第二个参数为纳秒 可以看出,当调用thread.join()方法后,main线程会进入等待,然后等待thread执行完之后再继续执行
join方法实际上调用的是Object的wait方法 wait方法会让线程进入阻塞状态,并且会释放线程占有的锁,并交出CPU执行权限。
- interrupt
nterrupt,中断。 单独调用interrupt方法可以使得处于阻塞状态的线程抛出一个异常, 也就说,它可以用来中断一个正处于阻塞状态的线程
- stop
stop方法已经是一个废弃的方法,它是一个不安全的方法。 因为调用stop方法会直接终止run方法的调用,并且会抛出一个ThreadDeath错误, 如果线程持有某个对象锁的话,会完全释放锁,导致对象状态不一致。 所以stop方法基本是不会被用到的。
Runnable
函数式编程 FunctionInterface
该注解不是必须的,如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响。 加上该注解能够更好地让编译器进行检查。 如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错