java线程详解

一、线程的创建方式

Java 中创建线程主要有以下三种方式:

  1. 继承 Thread 类

    scala 复制代码
    public class MyThread extends Thread {
        @Override
        public void run() {
            System.out.println("Thread running by extending Thread");
        }
    }
    // 使用
    MyThread thread = new MyThread();
    thread.start();
  2. 实现 Runnable 接口(推荐,避免单继承限制)

    java 复制代码
    public class MyRunnable implements Runnable {
        @Override
        public void run() {
            System.out.println("Thread running by implementing Runnable");
        }
    }
    // 使用
    Thread thread = new Thread(new MyRunnable());
    thread.start();
  3. 实现 Callable 接口 (可返回结果,需配合 FutureTask)

    typescript 复制代码
    public 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

状态说明

  1. NEW → RUNNABLE

    • 触发条件 : 调用线程的 start() 方法。
  2. RUNNABLE → BLOCKED

    • 触发条件 : 尝试进入 synchronized 块但锁被其他线程占用。
  3. BLOCKED → RUNNABLE

    • 触发条件 : 成功获取 synchronized 锁。
  4. RUNNABLE → WAITING

    • 触发条件: 调用以下方法之一:

      • Object.wait()(需其他线程唤醒)
      • Thread.join()(等待目标线程终止)
      • LockSupport.park()(需其他线程 unpark())。
  5. WAITING → RUNNABLE

    • 触发条件 : 被唤醒(notify()/notifyAll())、目标线程终止或 LockSupport.unpark()。
  6. RUNNABLE → TIMED_WAITING

    • 触发条件: 调用以下方法之一:

      • Thread.sleep(n)
      • Object.wait(timeout)
      • LockSupport.parkNanos(time)。
  7. TIMED_WAITING → RUNNABLE

    • 触发条件: 超时时间到或被中断唤醒。
  8. RUNNABLE → TERMINATED

    • 触发条件 : run() 方法执行完毕或抛出未捕获异常。
相关推荐
daidaidaiyu1 天前
ThingsBoard 集群的核心逻辑源码分析
java
我可能是个假开发1 天前
FTP Unicode 文件名导致 `550` 的问题分析与解决方案
java·开发语言·spring
caoerzhong1 天前
中小企业上 WMS 该先上哪几块:JeeWMS 开源 Java 仓库管理系统的分批上线清单
java·python·开源
【JAVA】玩家1 天前
Spring核心原理全解析:从零到生产实战
java·后端·spring
Wang's Blog1 天前
Java框架 SpringCloud 快速入门: 实现 Feign 最佳实践(抽取方式)
java·spring cloud
MandalaO_O1 天前
IDEA 开发(快捷键 + 调试 + 序列化)
java·ide·intellij-idea
xiaoqiMikko1 天前
JVM 线上排查实战(七):jps 看不见它、jstack 连不上它,可它明明活得好好的
java·jvm
狼爷1 天前
Rust/Go/Java/Python/PHP 大比拼:负载下后端框架到底差多少?
java·后端·编程语言
念何架构之路1 天前
zap扩展生态与总结
java·前端·数据库
第七页独白1 天前
汽车零件厂如何通过 QMS 真正落地 IATF 16949——QMS软件系统:品质检验-内审稽核-8d客诉管理:全星质量管理软件系统
java·前端·数据库