一、线程的创建方式
Java 中创建线程主要有以下三种方式:
-
继承
Thread
类scalapublic class MyThread extends Thread { @Override public void run() { System.out.println("Thread running by extending Thread"); } } // 使用 MyThread thread = new MyThread(); thread.start();
-
实现
Runnable
接口(推荐,避免单继承限制)javapublic class MyRunnable implements Runnable { @Override public void run() { System.out.println("Thread running by implementing Runnable"); } } // 使用 Thread thread = new Thread(new MyRunnable()); thread.start();
-
实现
Callable
接口 (可返回结果,需配合FutureTask
)typescriptpublic class MyCallable implements Callable<String> { @Override public String call() { return "Result from Callable"; } } // 使用 FutureTask<String> futureTask = new FutureTask<>(new MyCallable()); Thread thread = new Thread(futureTask); thread.start(); System.out.println(futureTask.get()); // 获取结果
二、线程的生命周期与状态
以下是使用 Mermaid 语法描述的 Java 线程状态变迁图,清晰展示状态之间的转换关系和触发条件:
scss
实例化(new Thread())
Thread.start()
Object.wait()
Thread.join()
LockSupport.park()
Object.notify()
Object.notifyAll()
LockSupport.unpark()
Thread.sleep(long)
Object.wait(long)
Thread.join(long)
LockSupport.parkNanos()
LockSupport.parkUntil()
超时时间到
Object.notify()
LockSupport.unpark()
等待进入synchronized方法/块
(锁被其他线程占用)
获取到锁
执行完成(run()结束)
未捕获异常
NEW
RUNNABLE
系统调度选择执行
yield() 或系统调度
系统调度选择执行
RUNNING
READY
WAITING
TIMED_WAITING
BLOCKED
TERMINATED
状态说明
-
NEW
→RUNNABLE
- 触发条件 : 调用线程的
start()
方法。
- 触发条件 : 调用线程的
-
RUNNABLE
→BLOCKED
- 触发条件 : 尝试进入
synchronized
块但锁被其他线程占用。
- 触发条件 : 尝试进入
-
BLOCKED
→RUNNABLE
- 触发条件 : 成功获取
synchronized
锁。
- 触发条件 : 成功获取
-
RUNNABLE
→WAITING
-
触发条件: 调用以下方法之一:
Object.wait()
(需其他线程唤醒)Thread.join()
(等待目标线程终止)LockSupport.park()
(需其他线程unpark()
)。
-
-
WAITING
→RUNNABLE
- 触发条件 : 被唤醒(
notify()
/notifyAll()
)、目标线程终止或LockSupport.unpark()
。
- 触发条件 : 被唤醒(
-
RUNNABLE
→TIMED_WAITING
-
触发条件: 调用以下方法之一:
Thread.sleep(n)
Object.wait(timeout)
LockSupport.parkNanos(time)
。
-
-
TIMED_WAITING
→RUNNABLE
- 触发条件: 超时时间到或被中断唤醒。
-
RUNNABLE
→TERMINATED
- 触发条件 :
run()
方法执行完毕或抛出未捕获异常。
- 触发条件 :