---
title: Java编程中常用到的线程和注意点总结
description: "- 继承Thread类（Extends Thread）：继承Thread类，覆盖run()方法，提供并发运行的过程。创建这个类的实例，使用start()方法启动线程。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengfaq/productfaq/grffaq/grf_faq_0014.html
sourcePath: /source/zh/kunpengfaq/productfaq/grffaq/grf_faq_0014.html
indexId: 4ee4558f937da24659c1f9f49afedbb3835f0d351be75b5e0bae6fe8f5bc580a57
---
# Java编程中常用到的线程和注意点总结

#### 创建线程方式

- 继承Thread类（Extends Thread）：继承Thread类，覆盖run()方法，提供并发运行的过程。创建这个类的实例，使用start()方法启动线程。
- 实现Runnable接口（Implements Runnable）：实现Runnable接口，实现run()方法，提供并发运行的过程。创建这个类的实例，用这个实例作为Thread构造器参数，创建Thread类，使用start()方法启动线程。


#### 线程状态

1. new运算创建线程后，线程进入New状态（初始状态）。
2. 调用start()方法后，线程从New状态进入Runnable状态（就绪状态）。start()方法是在main()方法（Running状态）中调用的。
3. 线程结束后，进入Dead状态（死亡状态），被对象垃圾回收。
4. 线程进入Dead状态后，能被垃圾回收，不能再开始。
5. 如果线程在运行过程中，自己调用了yield()方法，则主动由Running状态进入Runnable状态。

| 线程状态（英文） | 线程状态（中文） | 说明 |
| --- | --- | --- |
| New | 新建状态 | 当程序使用new关键字创建了一个线程后，该线程就处于新建状态，此时线程还未启动。 当线程对象调用start()方法时，线程启动，进入Runnable状态。 |
| Runnable | 可运行（就绪）状态 | 当线程处于Runnable状态时，表示线程准备就绪，等待获取CPU。 |
| Running | 运行状态 | 假如该线程获取了CPU，则进入Running状态，开始执行线程体，即run()方法中的内容。 说明： 如果系统只有1个CPU，那么在任意时间点则只有1条线程处于Running状态。 如果是双核系统，那么同一时间点会有2条线程处于Running状态。但是当线程数大于处理器数时，依然会是多条线程在同一个CPU上轮换执行。 当一条线程开始运行时，如果它不是一瞬间完成，那么它不可能一直处于Running状态，线程在执行过程中会被中断，目的是让其它线程获得执行的机会，像这样线程调度的策略取决于底层平台。对于抢占式策略的平台而言，系统会给每个可执行的线程一小段时间来处理任务，当该时间段（时间片）用完，系统会剥夺该线程所占CPU资源，让其他线程获得运行机会。 调用yield()方法，可以使线程由Running状态进入Runnable状态。 |
| Block | 阻塞（挂起）状态 | 当如下情况下，线程会进入阻塞状态： 线程调用了sleep()方法主动放弃所占CPU资源。 线程调用了一个阻塞式IO方法（例如控制台输入方法），在该方法返回前，该线程被阻塞。 当正在执行的线程被阻塞时，其它线程就获得执行机会了。当阻塞结束时，该线程将进入Runnable状态，而非直接进入Running状态。 |
| Dead | 死亡状态 | 当线程的run()方法执行结束，线程进入Dead状态。 说明： 请不要对一个已经死亡的线程调用start()方法，线程死亡后将不能再次作为线程执行，系统会抛出IllegalThreadStateException异常。 |
