一、Thread类提供的常用API
Thread类是多线程的核心类,Thread类常用的API如下表
方法名 | 功能说明 | 注意 |
start() | 启动一个新线程,在新的线程运行 run 方法中的代码 | start 方法只是让线程进入就绪,里面代码不一定立刻运行(CPU 的时间片还没分给它)。 每个线程对象的start方法只能调用一次 ,如果调用了多次,会出现IllegalThreadStateException |
run() | 新线程启动后会调用的方法 | |
yield() | 提示线程调度器让出当前线程对CPU的使用,让出后可能该线程又继续被调度执行 | 主要是为了测试和调试 |
sleep(long n) | 让当前执行的线程休眠n毫秒,休眠时让出 cpu的时间片给其它线程 | |
join() | 等待线程运行结束 | 谁调用,等待谁执行结束 |
join(long n) | 等待线程运行结束,最多等待 n毫秒 | 1、线程执行结束耗时小于n毫秒时,join方法会提前结束; 2、有多个线程都执行join时,总耗时会是最大的那个n值,并不是n累加 |
interrupt() | 打断线程(理解为设置打断标记为true) | 1、如果被打断线程正在 sleep、wait、join ,会导致被打断的线程抛出 InterruptedException,并清除打断标记; 2、如果打断正在运行的线程,不会抛出异常、不会清除打断标记; 3、park 的线程被打断,会导致被打断的线程抛出 InterruptedException,但不会清除打断标记; |
interrupted() | 打断线程(理解为设置打断标记为true),是Thread类的静态方法 | 会清除打断标记,即该方法被调用后,会设置线程打断标记为false |
isInterrupted() | 判断线程打断标记是否为true | 不会清除打断标记 |
currentThread() | 获取当前正在执行的线程 | |
getId() | 获取线程长整型 的 id | id 唯一 |
getName() | 获取线程名 | |
setName(String) | 修改线程名 | |
getPriority() | 获取线程优先级 | |
setPriority(int) | 修改线程优先级 | 1、java中规定线程优先级是1~10 的整数,较大的优先级能提高该线程被 CPU 调度的机率; 2、仅是设置优先级,哪个线程被调度还是由操作系统控制 |
isAlive() | 判断线程有没有运行完毕 | |
setDaemon() | 设置守护线程 | 默认情况下,Java 进程需要等待所有线程都运行结束,才会结束。有一种特殊的线程叫做守护线程,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束。 JVM启动后有哪些线程? -- main -- Finalizer:GC守护线程 --RMI:Java自带的远程方法调用 --Monitor :是一个守护线程,负责监听一些操作,也在main线程组中 |
getState() | 获取线程状态 | Java 中线程状态是用 6 个 enum 表示,分别为:NEW, RUNNABLE, BLOCKED, WAITING,TIMED_WAITING, TERMINATED |
stop() | 停止线程运行 | 已过时,容易破坏同步代码块,造成线程死锁 |
suspend() | 挂起(暂停)线程运行 | |
resume() | 恢复线程运行 |