定义:在java中,线程是程序中一个独立的执行流,它拥有自己的核心运行逻辑和状态。在操作系统中,线程是进程的一部分,是程序执行的最小单元。
重要性:多线程使得程序能够更好的利用CPU资源,同时处理多个任务,提升程序的响应速度和性能。
实现方式:
继承Thread类:通过扩展Thread类并重写其run()方法来定义线程的行为。
实现runable接口:通过实现runable接口并将该实现类的实例座位thread对象detarget来创建线程。
一、什么是线程
当线程启动后(线程对象调用start方法),它不能一直“独占”CPU运行,所以CPU需要在多线程之间切换,于是线程状态也会多次在运行、阻塞之间切换。
二、线程的生命周期
在线程的生命周期中:
经过:新建(new),就绪(Runable),运行(Running),阻塞(Blocked),死亡(dead)五种状态。
线程生命周期示例图
三、具体步骤详解
1、创建
public class XThread extends Thread{@Overridepublic void run() {}
}
//新建就是new出对象
XThread thread = new XThread(); //这就是新建
当程序使用了new关键字创建了一个线程之后,该线程就处于一个新建状态(初始状态),此时它与其他java对象一样,仅仅由java虚拟机为其分配了内存,并初始化了其成员变量值。此时的线程对象没有表现出任何线程的动态特征,程序也不会执行线程的线程执行体。
2、就绪
当线程对象调用了thread.start()方法之后,该线程就处于就绪状态。
java虚拟机会为其创建方法调用栈和程序计数器,处于这个状态的线程并没有开始运行,它只是表示该线程可以运行了。从start()源码中看出,start()后添加到了线程列表,接着在native层添加到VM中,至于该线程何时开始运行,取决于JVM里线程调度器的调度(如果OS调度被选中了,就会进入到运行状态)
3、运行
当线程对象调用了Thread.start()方法之后,该线程就处于就绪状态。
添加到了线程列表中,如果OS调度选中了,就会进入到运行状态。
4、阻塞
阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况大概三种:
- 等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入了等待池。(wait会释放持有的锁)
- 同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中
- 其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时。join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入阻塞状态。
线程睡眠:Thread.sleep(long millis)方法,使得线程转入到阻塞状态。
线程等待:
线程让步:
线程加入:
线程I/O:
线程唤醒:
5、死亡
- run()方法执行完,线程正常结束
- 线程抛出一个未捕获的exception或者error
- 直接调用stop()