Java五种状态以及常用的方法

Java线程的五种状态以及常用的方法

一、五种状态

  1. 创建状态(new)
  2. 准备就绪(Runnable)
  3. 运行状态(Runing)
  4. 堵塞状态(Blocked)
  5. 死亡状态(Dead)
    状态的示意图
    1.新建状态:就是说单纯的创建线程,创建线程的三种方式:1.继承Thread类,2.实现Runnable接口3.实现Callable接口
    2.准备就绪状态:当创建线程后调用线程的start方法来启动一个线程 表示进入准备就绪的状态
    3.运行状态,线程拿到CPU的时间片后会,会从准备就绪状态转成运行状态。
    4.堵塞状态:线程进入运行状态后,可能由于多种原因让线程进入阻塞状态,如:调用sleep()方法让线程睡眠,调用wait()方法让线程等待,调用join()方法、suspend()方法(它现已被弃用!)以及阻塞式IO方法。
    5.死亡状态:run方法的正常退出会进入线程的死亡状态,或者是有一个异常未被捕获而终止run方法的执行也将进入死亡状态。

常用的方法:

由于线程比较多线程的状态也不确定 所以需要给线程命名来区别线程,一下的方法可以设置和获取线程的名字。让不设置线程的名字时会默认的生成线程的名字。

(1)创建线程时设置线程名称:

public Thread(Runnable target,String name)
(2)设置线程名称的普通方法:

public final synchronized void setName(String name)
(3)取得线程名称的普通方法:

public final String getName()

休眠线程:

sleep方法
调用线程的sleep方法可以让线程睡眠等到指定的时间后会再恢复执行

  1. 线程休眠会交出CPU,让CPU去执行其他的事情
  2. 当当前线程持有某个对象锁时,但是线程不会释放对象锁,即使是睡眠状态其他线程也无法访问这个对象
  3. 线程睡眠是把线程从运行状态变成堵塞状态,当到了指定的时间后状态会从堵塞状态变成准备就绪的状态。

线程让步:暂停当前正在执行的线程对象,并执行其他线程。

  1. 调用yield()方法让当前线程交出CPU权限,让CPU去执行其他线程。
  2. yieId()方法和sleep方法类似会不会释放锁,但是它不能确定具体交出CPU的时间
  3. yieId只能让有相同优先级的线程获让CPU执行的机会,
  4. 使用yieId的方法不会让当前线程进入堵塞状态,会让当前的线程从运行状态变成准备就绪状态。只需要从新获取CPU的机会。

等待线程终止------join()方法

如果说在主线程调用该方法时 会先让主线程休眠,让调用join的线程先执行完毕后在执行主线程。

线程终止

1.标记终止
可以设置一个boolean 值 比如说这个值为true的时候让他正常的跳出run方法
2.使用stop()方法强制使线程退出,但是使用该方法不安全,已经被废弃了!
3.使用Thread类的interrupt()方法中断线程。
interrupted()是静态方法:内部实现是调用的当前线程的isInterrupted(),并且会重置当前线程的中断状态

isInterrupted()是实例方法,是调用该方法的对象所表示的那个线程的isInterrupted(),不会重置当前线程的中断状态

1)interrupt()方法只是改变中断状态而已,它不会中断一个正在运行的线程。具体来说就是,调用interrupt()方法只会给线程设置一个为true的中断标志,而设置之后,则根据线程当前状态进行不同的后续操作。

(2)如果线程的当前状态出于非阻塞状态,那么仅仅将线程的中断标志设置为true而已;

(3)如果线程的当前状态出于阻塞状态,那么将在中断标志设置为true后,还会出现wait()、sleep()、join()方法之一引起的阻塞,那么会将线程的中断标志位重新设置为false,并抛出一个InterruptedException异常。

(4)如果在中断时,线程正处于非阻塞状态,则将中断标志修改为true,而在此基础上,一旦进入阻塞状态,则按照阻塞状态的情况来进行处理。例如,一个线程在运行状态时,其中断标志设置为true之后,一旦线程调用了wait()、sleep()、join()方法中的一种,立马抛出一个InterruptedException异常,且中断标志被程序自动清除,重新设置为false。

总结:调用Thread类的interrupted()方法,其本质只是设置该线程的中断标志,将中断标志设置为true,并根据线程状态决定是否抛出异常。因此,通过interrupted()方法真正实现线程的中断原理是 :开发人员根据中断标志的具体值来决定如何退出线程。

  1. 线程等待------wait()方法

首先,wait()方法是Object类的方法,下面是无参的wait()方法:

public final void wait() throws InterruptedException {
wait(0);
}

wait

(1)wait()方法的作用是让当前正在执行的线程进入线程阻塞状态的等待状态,该方法时用来将当前线程置入“预执行队列”中,并且调用wait()方法后,该线程在wait()方法所在的代码处停止执行,直到接到一些通知或被中断为止。

(2)wait()方法只能在同步代码块或同步方法中调用,故如果调用wait()方法时没有持有适当的锁时,就会抛出异常。

(3)wait()方法执行后,当前线程释放锁并且与其他线程相互竞争重新获得锁。

线程唤醒-------notify()方法

首先,notify()方法也是Object类的方法:

public final native void notify();
(1)notify()方法要在同步代码块或同步方法中调用。

(2)notify()方法是用来通知那些等待该对象的对象锁的线程,对其调用wait()方法的对象发出通知让这些线程不再等待,继续执行。

(3)如果有多个线程都在等待,则由线程规划器随机挑选出一个呈wait状态的线程将其线程唤醒,继续执行该线程。

(4)调用notify()方法后,当前线程并不会马上释放该对象锁,要等到执行notify()方法的线程执行完才会释放对象锁。

. notifyAll()方法

Object类的notifyAll()方法:

public final native void notifyAll();
notifyAll()方法将同一对象锁的所有等待线程全部唤醒。

发布了3 篇原创文章 · 获赞 0 · 访问量 47

猜你喜欢

转载自blog.csdn.net/weixin_45342137/article/details/105584261