java多线程编程(二)- 线程的生命周期和优先级

一 线程的生命周期

  线程作为一个动态的顺序执行流,所以也拥有自己从新建到死亡的生命周期过程。

 

 

1, New :新建状态

  通过java提供的三种创建线程的方法创建线程对象后,该线程就处于了新建状态。新建状态的线程只占用系统的内存资源

 

2 ,Runnable:就绪状态

  新建状态的线程start()方法被调用,该线程的就进入了就绪状态,为了随时准备被JVM线程规划器进行调度,就绪状态的线程会占用除CPU资源外的所有需要的资源。另外阻塞状态的线程满足了unblocked的条件或者yieId()使运行状态的线程放弃了CPU的资源,线程也会进入就绪状态,个人把就绪状态称之为“三一”状态,即三进一出。

 

3,Running:执行状态

  只有就绪状态的线程获得了CPU资源,线程才能进入了执行状态,执行线程的run()方法。执行状态的线程容易被干扰,不能正常的将run()方法执行结束,从而不能进入死亡状态。当出现Blocking event(阻塞事件),线程就会进入阻塞状态,当执行过程中因为非阻塞事件导致的失去CPU资源,线程就会返回到就绪状态,因而个人把执行状态称之为“一三”状态,即一进三出。

 

4,Blocked:阻塞状态 🔼

  等待阻塞:线程的wait()方法,suspend()挂起方法被调用,线程失去CPU资源,进入对象等待池 ,线程进入阻塞状态。

  同步阻塞:线程run()方法执行过程中,访问synchronized资源时没有获取到synchronized同步锁,线程就会进入对象锁池,线程进入阻塞状态。

  其它阻塞:出现线程的sleep()方法被调用,调用了其它线程的join()方法或者run()中发出I/O请求这三种情况线程就进入了阻塞状态,因此在编写run()方法时尽量不使用system.out.println()或system.in.read(),防止线程发出I/O请求使线程进入阻塞状态。

  ps:wait()方法会释放资源,而sleep()方法还会占用资源,所以wait() notify() notifyAll() 需要放入同步代码块中不需要捕捉异常,而sleep方法需要捕捉异常。

 

5 ,Dead 死亡状态

  运行状态的线程run()方法执行完成,线程就进入了死亡状态。当然线程的interrupt() stop()等中断方法被调用线程,也会进入死亡状态,这种为异常的进入死亡状态。

                

 

二 线程的优先级

   1,每个线程都有一个优先级别,是JVM线程规划器进行调度重要参考。

   2,线程优先级是一个整数从1(Thread.MIN-PRIORITY)-10(Thread.MAX-PRIORITY),默认情况下是5(Thread.NORM-PRIORITY),可以使用setPriority(int priority)设置线程的优先级。

   3,优先级越高的线程则对进程越重要,应该比优先级低的线程先分配资源,但不能保证优先级高的线程先执行,因此不能通过设置线程的优先级去控制线程的执行顺序。

 

 

 

 

 

 

 

参考资料:http://www.runoob.com

     http://www.cnblogs.com/mengdd/archive/2013/02/16/2913649.html

     http://blog.sina.com.cn/s/blog_6af29f290100s3y9.html

原文地址:http://www.cnblogs.com/xiaojia-new/p/8557051.html

posted @ 2018-03-13 15:19  萧嘉  阅读(172)  评论(0编辑  收藏  举报