一、线程的创建方式
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()方法执行完毕或抛出未捕获异常。
- 触发条件 :