鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

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异常。