【多线程】线程的方法简介

292 阅读3分钟

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 中,有两种线程:

  • 用户线程
  • 守护线程,一种特殊的线程,当进程中不存在非守护线程时,守护线程自动销毁。垃圾回收线程,就是一种比较典型的守护线程。