JUC并发编程day1
类别方法签名所属类 / 接口核心作用生命周期start()Thread启动新线程run()Thread线程执行体join()Thread等待线程终止yield()Thread(static)主动让出 CPU中断Thread中断线程(设置标记)Thread检查中断状态(不清除)Thread(static)检查当前线程中断状态(清除)协作 (Object)wait()Object等待,释放锁notif
·
第一部分:java.lang.Thread 类的核心方法
这是最基础、最直接的线程操作方法。
1. 线程生命周期管理
-
start()- 作用:启动一个新线程。JVM 会为该线程分配资源,并使其进入RUNNABLE状态,等待 CPU 调度执行。必须调用此方法才能真正启动线程,而不是直接调用
run()方法。 - 注意:一个线程对象只能调用一次
start()方法,多次调用会抛出IllegalThreadStateException。
- 作用:启动一个新线程。JVM 会为该线程分配资源,并使其进入RUNNABLE状态,等待 CPU 调度执行。必须调用此方法才能真正启动线程,而不是直接调用
-
run()- 作用:线程的执行体。当线程被 CPU 调度后,它会执行
run()方法中的代码。 - 注意:这是一个普通方法,直接调用它并不会创建新线程,只会在当前线程中串行执行。
- 作用:线程的执行体。当线程被 CPU 调度后,它会执行
-
join()- 作用:等待该线程终止。调用
thread.join()的线程会进入WAITING状态,直到thread执行完毕。 - 重载:
join(long millis):等待该线程终止的时间最长为millis毫秒。
- 作用:等待该线程终止。调用
-
yield()- 作用:暂停当前正在执行的线程对象,并执行其他线程。这是一个静态方法。
- 注意:这只是一个 “建议”,告诉调度器 “我愿意放弃当前的 CPU 资源”,但调度器不一定会采纳。它不会释放锁。
2. 线程信息获取与设置
-
getName()/setName(String name)- 作用:获取和设置线程的名称。
-
getPriority()/setPriority(int newPriority)- 作用:获取和设置线程的优先级。优先级范围是 1 到 10,默认是 5。
- 注意:优先级高的线程获得 CPU 调度的概率更大,但不保证一定先执行。
-
getState()- 作用:获取线程的状态,返回一个
Thread.State枚举值。 - 状态包括:
NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED。
- 作用:获取线程的状态,返回一个
-
isAlive()- 作用:测试线程是否处于活动状态。如果线程已经启动且尚未终止,则为活动状态。
3. 线程中断机制
-
interrupt()- 作用:中断线程。这只是给线程设置一个 “中断标记”,并不会强制停止线程。
- 行为:
- 如果线程正处于
sleep(),wait(),join()等阻塞状态,会抛出InterruptedException,并清除中断标记。 - 如果线程处于正常运行状态,只会设置中断标记,线程需要自己检查这个标记来决定是否停止。
- 如果线程正处于
-
isInterrupted()- 作用:测试线程是否已经被中断。不会清除中断标记。
-
interrupted()(静态方法)- 作用:测试当前线程是否已经被中断。会清除中断标记。
4. 守护线程 (Daemon Thread)
-
setDaemon(boolean on)- 作用:将该线程标记为守护线程或用户线程。
- 注意:必须在调用
start()方法之前设置。当 JVM 中只剩下守护线程时,JVM 会自动退出。
-
isDaemon()- 作用:测试该线程是否为守护线程。
第二部分:java.lang.Object 类的线程控制方法
所有对象都继承了这些方法,它们是实现线程间协作的基础。
-
wait()- 作用:让当前线程进入WAITING状态,并释放它持有的该对象的锁。
- 注意:必须在
synchronized方法或代码块中调用,否则会抛出IllegalMonitorStateException。
-
wait(long timeout)- 作用:让当前线程进入TIMED_WAITING状态,并释放锁。如果在
timeout毫秒内没有被唤醒,线程会自动醒来。
- 作用:让当前线程进入TIMED_WAITING状态,并释放锁。如果在
-
notify()- 作用:唤醒在此对象监视器上等待的单个线程。
- 注意:同样必须在
synchronized方法或代码块中调用。唤醒哪个线程是随机的。
-
notifyAll()- 作用:唤醒在此对象监视器上等待的所有线程。
第三部分:java.util.concurrent 包中的常用方法
这是现代 Java 并发编程的核心,提供了更强大、更安全的线程控制方式。
1. 线程池 (Executor Framework)
ExecutorService接口的核心方法submit(Callable<T> task)/submit(Runnable task):提交一个任务到线程池执行。shutdown():平滑关闭线程池。不再接受新任务,但会等待已提交的任务执行完毕。shutdownNow():立即关闭线程池。尝试停止所有正在执行的任务,并返回等待队列中未执行的任务列表。awaitTermination(long timeout, TimeUnit unit):等待线程池在指定时间内终止。
2. Lock 与 Condition
-
Lock.lock()/lock.unlock()- 作用:替代
synchronized关键字,提供更灵活的锁机制。必须在try...finally块中使用,确保锁一定被释放。
- 作用:替代
-
Condition.await()/condition.signal()/condition.signalAll()- 作用:替代
Object.wait(),notify(),notifyAll()。Condition对象由Lock对象创建,实现了更精确的线程间通信。
- 作用:替代
3. Future
-
future.get()- 作用:获取异步任务的执行结果。如果任务尚未完成,调用此方法的线程会阻塞,直到任务完成。
- 重载:
get(long timeout, TimeUnit unit):在指定时间内等待结果,超时则抛出TimeoutException。
-
future.cancel(boolean mayInterruptIfRunning)- 作用:尝试取消任务的执行。如果任务已完成或已取消,则失败。
总结表格
| 类别 | 方法签名 | 所属类 / 接口 | 核心作用 |
|---|---|---|---|
| 生命周期 | start() |
Thread |
启动新线程 |
run() |
Thread |
线程执行体 | |
join() |
Thread |
等待线程终止 | |
yield() |
Thread (static) |
主动让出 CPU | |
| 中断 | interrupt() |
Thread |
中断线程(设置标记) |
isInterrupted() |
Thread |
检查中断状态(不清除) | |
interrupted() |
Thread (static) |
检查当前线程中断状态(清除) | |
| 协作 (Object) | wait() |
Object |
等待,释放锁 |
notify() |
Object |
唤醒单个等待线程 | |
notifyAll() |
Object |
唤醒所有等待线程 | |
| 协作 (Lock) | condition.await() |
Condition |
等待,释放锁 |
condition.signal() |
Condition |
唤醒单个等待线程 | |
condition.signalAll() |
Condition |
唤醒所有等待线程 | |
| 线程池 | executorService.submit() |
ExecutorService |
提交任务 |
executorService.shutdown() |
ExecutorService |
关闭线程池 | |
| Future | future.get() |
Future |
获取异步任务结果(阻塞) |
future.cancel() |
Future |
取消任务 |
这份总结涵盖了 Java 线程编程从基础到高级的绝大多数核心方法。
更多推荐



所有评论(0)