thread类的方法有哪些:实用分类与用法区别
thread类的方法包含线程创建、启动、状态查询、等待、终止、优先级设置、守护配置八大核心类别,JavaThread类官方JDK17文档定义了20余个可用方法,所有方法可直接操作线程生命周期,你可根据线程启动、阻塞、销毁、监控的不同场景直接选用,多数方法适用于常规单多线程开发场景,仅部分废弃方法不推荐在生产环境使用。
thread类核心生命周期方法
start()是线程启动核心方法,会向JVM发起线程调度请求,自动调用底层run()方法,新建线程进入就绪状态,而非直接进入运行状态。该方法仅能调用一次,重复调用会直接抛出IllegalThreadStateException异常,是线程开发中必须优先使用的启动方式。run()为线程业务逻辑承载方法,仅用于重写编写线程执行代码,手动调用该方法只会在当前主线程同步执行逻辑,不会创建新线程,无法实现多线程效果。
sleep(longmillis)是线程休眠方法,可让当前线程暂停指定毫秒数,休眠期间线程不会释放锁资源,时间结束后自动恢复就绪状态。该方法会抛出受检异常InterruptedException,代码中必须手动捕获或抛出,日常开发中常用于模拟延时执行、控制线程执行频率。
yield()为线程礼让方法,会让当前正在运行的线程主动让出CPU执行权,回到就绪状态,等待系统重新调度。该方法无法保证礼让效果,仅能提升其他同优先级线程的执行概率,不会改变线程优先级,也不会造成线程阻塞。
thread类线程等待与终止方法
join()系列方法用于线程阻塞等待,包含无参、带毫秒、带毫秒纳秒三种重载形式,能让当前线程暂停执行,直至目标线程完全执行完毕或达到指定等待时长。该方法常用于多线程串行执行场景,确保前置线程任务完成后,再执行后续线程逻辑,同样需要处理中断异常。
interrupt()是线程中断核心方法,不会直接终止线程,仅会修改线程的中断标记状态。处于sleep、join、wait阻塞状态的线程会立即抛出中断异常并清除标记,运行中的线程仅会更新标记,开发者可通过标记状态自主判断是否终止线程,是目前唯一推荐的线程终止合规方式。
stop()、suspend()、resume()均为JDK废弃方法,JDK1.8官方文档明确标注弃用且不推荐使用。stop()会强制终止线程,直接释放所有锁资源,极易造成数据不一致、事务错乱问题;suspend()和resume()会引发线程死锁、资源挂起问题,生产环境需完全规避。
thread类状态与属性查询方法
isAlive()可快速判断线程存活状态,线程处于就绪、运行、阻塞状态时返回true,线程执行完毕、未启动或已销毁时返回false,常用于循环监控线程执行状态。
currentThread()是静态核心方法,可直接获取当前正在执行代码的线程对象,无需创建线程实例即可调用,广泛用于日志打印、线程信息统计、动态设置线程属性的场景。
| 方法类别 | 代表方法 | 核心用途 | 使用风险 |
|---|---|---|---|
| 启动执行 | start()、run() | 创建线程、执行业务逻辑 | start()重复调用会抛异常 |
| 延时控制 | sleep()、yield() | 线程休眠、CPU礼让 | sleep()需处理中断异常 |
| 阻塞等待 | join() | 线程串行等待执行 | 长时间等待易造成程序卡顿 |
| 中断终止 | interrupt() | 标记线程中断状态 | 无法直接终止运行线程 |
| 废弃终止 | stop()、suspend() | 强制停止、挂起线程 | 风险较高,生产环境禁用 |
| 状态查询 | isAlive()、currentThread() | 查询线程状态、获取线程对象 | 风险较低,可通用 |
该系列方法的适用边界是仅适配Java原生Thread线程对象,无法作用于线程池ThreadPoolExecutor、虚拟线程VirtualThread等衍生线程对象,这类衍生线程需使用专属API完成生命周期操作。
线程优先级相关方法getPriority()、setPriority(),可获取或设置线程优先级,优先级取值范围为1-10,默认值为5。该优先级仅为JVM调度参考依据,不同操作系统适配规则不同,无法精准控制线程执行顺序,仅能微调线程调度概率。
守护线程方法isDaemon()、setDaemon(booleanon),用于判断和设置线程是否为守护线程。守护线程依附主线程存在,主线程结束后守护线程会自动终止,适用于日志监控、后台轮询等辅助任务,必须在线程start()调用前完成设置,否则会抛出异常。
