Java 线程解析

1.线程的生命周期

线程分为五个生命周期:创建、就绪、运行、阻塞、死亡。

创建:线程对象创建,即处于创建
就绪:当调用start()方法时候,线程进入就绪状态,等待CPU的调度
运行:当线程获得CPU的调度时,进入运行状态执行run方法
阻塞: 处于运行的线程在以下情况下,进入的状态,阻塞原因消除后,自动进入就绪状态。

  • sleep()方法

Thread类的方法,表示让一个线程进入睡眠状态,等待一定的时间之后,自动进入就绪状。

调用sleep方法会抛出异常,并且不会释放对象锁,即如果线程持有Synchronized对象,sleep时会一直持有,其他线程无法访问该对象。

  • wait()方法

wait方法属于Object类,针对对象锁的方法,调用wait会将该对象释放。

wait方法不会抛出异常,当到指定时间时,如果对象没有被别的线程占用,则再次获得锁,结束后,调用后续代码。如果对象被占用,必须对象得到释放后,才会再次获得锁。如果wait方法没有设置超市时间,其他线程必须执行notify方法才能重新获得锁。

  • yield()方法

Thread类的方法,表示线程重新回到就绪状态,以允许具有相同优先级的其他线程获得运行机会,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。

  • 对象锁被占用

线程试图调用某个类/对象的同步方法,但是对象锁不可用时,也会进入阻塞状态。


死亡:处于死亡或者终结状态的线程将不再是可调度的,并且也不会被分配到时间片。线程死亡的方式通常是run方法执行完,或者被中断;

  • 中断

Thread类包含interrupt方法,用于终止被阻塞的任务。调用interrupt方法将设置线程的中断状态,如果一个线程已经被阻塞或者试图执行一个阻塞操作,那么设置线程的中断状态将抛出InterruptedException异常。当抛出InterruptedException异常或者该任务调用Thread.interrupted()时,线程中断状态将被重置。这个中断被阻塞的线程需要我们持有线程对象。


2.线程的堆栈

线程的内存模型:main memory(主存)、working memory(线程栈)

Thread类实例是一个对象,对象处于堆内存中,每个线程实例有一个调用栈,即每创建一个线程,就产生一个调用栈,记录函数执行顺序,之所以每个线程有一个独立栈,是为了并行运行。

你可能感兴趣的:(Java 线程解析)