黑马程序员技术交流社区

标题: 线程 [打印本页]

作者: ╰_hEy_ゞ    时间: 2014-3-13 10:35
标题: 线程
本帖最后由 ╰_hEy_ゞ 于 2014-3-13 12:26 编辑

线程一个完整的生命周期要经历几种状态,再把这几种状态详细说一下,谢谢

作者: chen20134    时间: 2014-3-13 10:53
当线程被创建并启动之后,它既不是一启动就进入执行状态,也不是一直处于执行状态,在其生命周期中,要经过“新建(New)”、“就绪(Runnable)”、“运行(Running')”、“阻塞(Blocked)”和“死亡(Dead)”五种状态。线程在创建之后,不可能一直霸占着CPU独立运行,需要在多个线程之间切换,所以大部分时间处于运行、阻塞之间切换。
一、新建和就绪状态
(1)、当用new关键字创建一个线程的时候,该线程就处于新建状态;
(2)、调用start()方法之后,线程就进入了就绪状态。当不能立刻进入运行状态,要等待JVM里线程调度器的调度。
二、运行和阻塞状态
如果处于就绪状态的线程获得了CPU,就开始执行run方法,处于了运行状态。当分配的时间用完后,又进入了就绪状态,等待下次分配到CPU在进入运行状态。
进入阻塞状态的程序遇到以下情况才能恢复进入就绪状态,等待分配到资源进入运行状态:
三、线程死亡
(1)、run()或call()方法执行完成,线程正常结束;
(2)、线程抛出一个未捕获的Exception或Error;
(3)、直接调用该线程的stop()方法来结束该线程———该方法容易导致死锁,不推荐。
注意:当主线程结束时,其他线程不收任何影响,并不会随之结束。一旦子线程启动起来后,他就拥有和主线程相同的地位,他不会受主线程的影响。

为了测试某个线程是否已经死亡,可以调用线程对象的isAlive方法,当线程处于就绪、运行、阻塞3中状态是,该方法返回true;当线程处于新建、死亡2种状态时,该方法将返回false。

作者: 王浩龙    时间: 2014-3-13 10:53
  1. class Res
  2. {
  3.         String name;
  4.         String sex;
  5.         boolean flag = false;
  6. }

  7. class Input implements Runnable
  8. {
  9.         private Res r ;
  10.         Input(Res r)
  11.         {
  12.                 this.r = r;
  13.         }
  14.         public void run()
  15.         {
  16.                 int x = 0;
  17.                 while(true)
  18.                 {
  19.                         synchronized(r)
  20.                         {

  21.                                 if(r.flag)
  22.                                         try{Thread.sleeps(10);}catch(Exception e){}//这里是sleep的冻结状态没有释放锁,这有到时间自己就换唤醒
  23.                                         try{r.wait();}catch(Exception e){}//这里是wait的冻结状态(释放锁),只有notify可以唤醒
  24.                                 if(x==0)
  25.                                 {
  26.                                         r.name="mike";
  27.                                         r.sex="man";
  28.                                 }
  29.                                 else
  30.                                 {
  31.                                         r.name="丽丽";
  32.                                         r.sex = "女女女女女";
  33.                                 }
  34.                                 x = (x+1)%2;
  35.                                 r.flag = true;
  36.                                 r.notify();
  37.                         }
  38.                 }
  39.         }
  40. }

  41. class Output implements Runnable
  42. {
  43.         private Res r ;
  44.        
  45.         Output(Res r)
  46.         {
  47.                 this.r = r;
  48.         }
  49.         public void run()
  50.         {
  51.                 while(true)
  52.                 {
  53.                         synchronized(r)
  54.                         {
  55.                                 if(!r.flag)
  56.                                         try{r.wait();}catch(Exception e){}
  57.                                 System.out.println(r.name+"...."+r.sex);
  58.                                 r.flag = false;
  59.                                 r.notify();
  60.                         }
  61.                 }
  62.         }
  63. }


  64. class  InputOutputDemo
  65. {
  66.         public static void main(String[] args)
  67.         {
  68.                 Res r = new Res();

  69.                 Input in = new Input(r);
  70.                 Output out = new Output(r);

  71.                 Thread t1 = new Thread(in);
  72.                 Thread t2 = new Thread(out);

  73.                 t1.start();//线程的被创建状态,可以去执行run方法
  74.                 t2.start();
  75.                 //线程中的run方法结束,线程也就结束了。stop方法结束已经不常用了。
  76.         }
  77. }
复制代码
线程的一个生命周期要经历几个状态是要看你调用的方法的。线程共有四种状态,被创建,运行,冻结,和消亡。
请看下面的代码。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2