1. currentThread()
返回当前正在执行的线程。
2. getId()
获取线程的唯一标识。
public static void main(String[] args) {
System.out.println("Current thread ID: " + Thread.currentThread().getId());
Thread thread = new Thread(() -> System.out.println("My thread ID: " + Thread.currentThread().getId()));
thread.start();
System.out.println("My thread ID: " + thread.getId());
}
获得结果如下,其中 1 为 main 方法的线程 ID,11 为自定义线程的 ID
Current thread ID: 1
My thread ID: 11
My thread ID: 11
3. sleep()
让当前“正在执行的线程”休眠指定的毫秒数(暂停执行)。
4. isAlive()
判断当前线程是否处于活动状态,活动状态指线程已经启动且尚未终止。
5. interrupt(): 停止线程
仅仅是在当前线程中打一个停止的标记,并不会真的停止线程。
Java 中有 3 种方法,可以终止正在运行种的线程:
- 使用退出标记,使线程正常退出,即 run() 方法完成后线程终止;
- 使用 stop() 强行终止线程,因为 stop() 是不安全的可能会造成不可预料的结果,目前已经作废;
- 使用 interrupt() 中断线程,正常情况下该方法不会终止一个正在运行的线程,需要加入一个判断才可以达到终止线程的目的;
另外,还有两个方法可以用来测试线程的状态:
- interrupted(): 测试当前线程是否已经中断,执行后将状态标志清除为 false。
- isInterrupted(): 测试线程是否已经是中断状态,但不清除状态。
当线程在 sleep 状态下执行 interrupt(),则会抛出异常,并清除停止状态值。
6. suspend() 与 resume()
- suspend(): 可以暂停线程;
- resume(): 用于恢复线程;
这两个方法的优缺点有以下两点:
- 独占,容易造成公共的同步对象的独占,使其他线程无法访问。
- 不同步,容易出现因为线程的暂停而导致数据不同步的情况。
目前这两个方法已经废弃。
7. yield()
放弃当前的 CPU 资源,将它让给其他的任务去占用 CPU 执行时间。但放弃的时间不确定,有可能刚放弃又马上获得 CPU 时间片。
8. setPriority(): 优先级
在操作系统中,线程是有优先级的,CPU 优先执行优先级较高的线程。在 Java 中,线程的优先级分 1~10 个等级,如果小于 1 或者 大于 10,则 JDK 会抛出异常。
线程的优先级具有两个特性:
- 继承性:线程的优先级具有继承性,比如 A 线程启动了 B 线程,则 B 线程的优先级与 A 一样;
- 规则性:线程的优先级与代码执行顺序无关,只是 CPU 尽量将执行资源让给优先级比较高的线程;
- 随机性:优先级较高的线程不一定每一次都先执行完; (线程优先级与打印顺序无关)
9. isDaemon(): 守护线程
在 Java 中,有两种线程:
- 用户线程
- 守护线程,一种特殊的线程,当进程中不存在非守护线程时,守护线程自动销毁。垃圾回收线程,就是一种比较典型的守护线程。