Thread 源码分析
Thread 的特点
每个 Thread 都有线程优先级,一般高优先级的线程可能会优先执行
父线程创建子线程后,子线程的优先级、守护线程属性和父线程是一致的
退出方法被调用,线程会停止
所有非守护线程都消亡,或者从运行的方法正常返回,或者运行的方法抛出了异常,线程会停止
线程都有名字,多个线程可能具有相同的名字,Thread 有的构造器如果没有指定名字,会自动生成一个名字。
线程的状态
NEW:表示线程创建成功,但没有处于运行中,在 new Thread 之后,没有 start 之前,线程的状态都是 NEW
当运行 strat 方法,线程被创建成功之后,线程的状态变成 RUNNABLE,RUNNABLE 表示线程正在运行中;
子线程如果运行完成、或被打断、或被中止,状态都会从 RUNNABLE 变成 TERMINATED,TERMINATED 表示线程运行结束;
如果线程在等待获得 monitor lock 锁,会从 RUNNABLE 变成 BLOCKED,BLOCKED 表示阻塞;
WAITING 和 TIMED_WAITING 类似,都表示在遇到 Object.wait()、Thread.join() 等方法时,线程就会等待另一个线程执行完特定的动作之后,才能结束等待。
线程初始化的方式
继承 Thread
实现 Runnable 接口
实现 Callable 接口+FutureTask(可以拿到返回结果,可以处理异常)
线程池创建线程
Java 中,类只能支持单继承,当定义一个新的类的时候,如果这个类是自定义的线程类,那继承了 Thread 就不能再继承其他的类了。如果自定义类必须扩展其他的类,就可以使用实现 Runnable 接口的方法来定义该类为线程类。
线程常用方法:
join():当前线程(调用此方法的线程)等待另一个线程执行完成之后,才能继续操作
yield():当前线程(调用此方法的线程)放弃当前 cpu 的使用权,让 cpu 重新选择线程,线程重新竞争 cpu 资源的使用
sleep():指定当前线程会睡眠多长时间,但睡眠时不会释放锁
评论