线程常用方法,线程状态及优先级详解

线程状态图

1.新建状态: 线程对象一旦创建就进入新建状态。Thread.State.NEW

2.就绪状态: 当调用start()方法,线程立即进入就绪状态,等待cpu调度。  

3.运行状态: cup调度,执行线程体的代码块。Thread.State.RUNNABLE

4.阻塞状态: 当调用sleep(),wait(),或同步锁定时,线程进入阻塞状态,阻塞状态解除后,重新进入就绪状态,等待cpu调度。Thread.State.TIMED_WAITING

5.死亡状态 : 线程中断或者结束后进入死亡状态(注意:死亡之后不能再启动)  Thread.State.TERMINATED

注意:getState()方法获取线程状态

如何设置线程优先级? 

Thread.currentThread().getPriority(); 

thread.setPriority(5);

优先级的设定在线程start()调度之前

优先级高低只是意味着获得调度的概率高低,并不是优先级低就不调用了,都是看CPU的调度

线程常用方法:

线程等待和唤醒的方法

wait():wait方法来自Object,wait()的作用是让当前线程进入等待(阻塞)状态,同时wait()也会让当前线程释放它所持有的锁,wait()方法则只能在同步方法或同步块中使用。

notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程;notify()是唤醒单个线程,而notifyAll()是唤醒所有的线程

线程让步和休眠

yield():yield方法的作用是让步,它能让当前线程由“运行状态”进入到“就绪状态”,从而让其他具有相同优先级的等待线程获取执行权;但是,并不能保证在当前线程调用yield()之后,其他具有相同优先级的线程就一定能获得执行权;也有可能是当前线程有进入到“运行状态”继续运行。

yield()和wait()的比较

  wait()是让线程由“运行状态”进入到“等待(阻塞)状态”,而yield()是让线程由“运行状态”进入到“就绪状态”。

  wait()是会让线程释放它所持有的对象的同步锁,而yield()方法不会释放对象的同步锁。

  yield()是Thread方法,wait()是Object方法。

sleep():sleep方法定义在Thread类中,sleep()的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”。sleep()会指定休眠时间,线程休眠的时间会大于/等于该休眠时间;在线程重新被唤醒时,它会由“阻塞状态”变成“就绪状态”,从而等待CPU的调度执行。

sleep()和wait()的比较

  wait()会释放对象的同步锁,而sleep()则不会释放锁。

  sleep()是Thread方法,wait()是Object方法。

join()方法和interrupt()方法

t.join()方法只会使主线程(或者说调用t.join()的线程)进入等待池并等待t线程执行完毕后才会被唤醒。并不影响同一时刻处在运行状态的其他线程

interrupt()只是改变中断状态而已。interrupt()不会中断一个正在运行的线程。

这一方法实际上完成的是给受阻塞的线程抛出一个中断信号,这样受阻线程就得以退出阻塞的状态。更确切的说,如果线程被Object.wait,Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。

 

posted @ 2021-05-24 23:24  江南大才子  阅读(262)  评论(0编辑  收藏  举报