一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第28天,点击查看活动详情。
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():指定当前线程会睡眠多长时间,但睡眠时不会释放锁