A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© itheima_llt 高级黑马   /  2015-4-10 23:52  /  413 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. /**
  2. 停止线程
  3. 原理:让run方法结束。而run方法中通常定义循环结构,所以就是控制住循环结构就可以了。

  4. stop方法已经过时了。

  5. 如何控制循环结构??
  6. 1 定义结束标记
  7. 2 当线程处于了冻结状态,没有执行标记,程序一样无法结束。
  8.                 这时可以循环,正常退出冻结状态,或者强制结束冻结状态。
  9.                 强制结束冻结状态:interrupt();目的是线程强制从冻结状态恢复到运行状态。
  10.                 但是会发生InterruptedException异常。



  11. */

  12. /*
  13. //1 定义结束标记结束线程
  14. class StopThread implements Runnable
  15. {
  16.         boolean flag = true;//定义标记控制循环结构

  17.         //覆盖run方法
  18.         public void run()
  19.         {
  20.                 while(flag)
  21.                 {
  22.                         System.out.println(Thread.currentThread().getName()+"...run");//打印调用run方法的线程名
  23.                 }
  24.         }

  25.         //改变标记
  26.         public void changeFlag()
  27.         {
  28.                 flag = false;
  29.         }
  30. }


  31. class StopThreadDemo
  32. {
  33.         public static void main(String[] args)
  34.         {
  35.                 StopThread st = new StopThread();//建立实现了Runnable接口的类的对象
  36.                 Thread t1 = new Thread(st);//建立线程1
  37.                 Thread t2 = new Thread(st);//建立线程2
  38.                 t1.start();//启动线程1,调用run方法
  39.                 t2.start();//启动线程2,调用run方法

  40.                 //定义一个循环,等线程1和线程2运行一会儿之后,主线程再把标记flag改为false
  41.                 int num = 0;
  42.                 while(true)
  43.                 {
  44.                         if(num++ == 50)
  45.                         {
  46.                                 st.changeFlag();//改变run方法中while循环的标记
  47.                                 break;//改变标记后,立刻结束主线程的while循环
  48.                         }
  49.                         System.out.println(Thread.currentThread().getName()+"......run"+num);//展示主线程执行的结果
  50.                 }
  51.                 System.out.println("over");//表示主线程执行完毕
  52.         }
  53. }
  54. */
  55. /*
  56. 部分运行结果:
  57. Thread-0...run
  58. Thread-0...run
  59. Thread-1...run
  60. Thread-0...run
  61. main......run50
  62. Thread-0...run
  63. Thread-1...run
  64. over

  65. 从控制台中,可以看到,当主线程运行while循环50次后,
  66. 就从while循环中跳出来,并执行结束了。
  67. 而且线程1和线程也结束了。
  68. */

  69. /*
  70. 下面看一下当线程处于冻结状态时候如何结束线程
  71. */
  72. /*
  73. class StopThread implements Runnable
  74. {
  75.         boolean flag = true;//定义标记控制循环结构

  76.         //覆盖run方法,注意只有在同步中才可以使用wait
  77.         public synchronized void run()
  78.         {
  79.                 while(flag)
  80.                 {
  81.                         try
  82.                         {
  83.                                 wait();
  84.                         }
  85.                         catch (InterruptedException e)
  86.                         {
  87.                                 System.out.println(Thread.currentThread().getName()+"...异常");
  88.                                 flag = false;//中断线程的冻结状态后,立即改变标记,结束循环,结束run,结束线程
  89.                         }
  90.                         System.out.println(Thread.currentThread().getName()+"...run");//打印调用run方法的线程名
  91.                 }
  92.         }
  93. }


  94. class StopThreadDemo
  95. {
  96.         public static void main(String[] args)
  97.         {
  98.                 StopThread st = new StopThread();//建立实现了Runnable接口的类的对象
  99.                 Thread t1 = new Thread(st);//建立线程1
  100.                 Thread t2 = new Thread(st);//建立线程2
  101.                 t1.start();//启动线程1,调用run方法
  102.                 t2.start();//启动线程2,调用run方法

  103.                 //定义一个循环,等线程1和线程2运行一会儿之后,主线程再把标记flag改为false
  104.                 int num = 0;
  105.                 while(true)
  106.                 {
  107.                         if(num++ == 50)
  108.                         {       
  109.                                 t1.interrupt();//强制清楚线程1的冻结状态
  110.                                 t2.interrupt();//强制清楚线程1的冻结状态
  111.                                 break;//改变标记后,立刻结束主线程的while循环
  112.                         }
  113.                         System.out.println(Thread.currentThread().getName()+"......run"+num);//展示主线程执行的结果
  114.                 }
  115.                 System.out.println("over");//表示主线程执行完毕
  116.         }
  117. }
  118. */

  119. /*
  120. public synchronized void run()
  121.         {
  122.                 while(flag)
  123.                 {
  124.                         try
  125.                         {
  126.                                 this.wait();
  127.                         }
  128.                         catch (InterruptedException e)
  129.                         {
  130.                         }
  131.                         System.out.println(Thread.currentThread().getName()+"...run");//打印调用run方法的线程名
  132.                 }
  133.         }
  134. 在把run方法改为上面这样的时候,运行结果显示:
  135. 线程1和线程2一调用run方法就陷入冻结状态。
  136. 而且,直到主线程结束,它们也没有结束。

  137. 对此,我们利用interrupt方法来强制中断线程的冻结状态。

  138. 总结:
  139. 特殊情况:
  140. 当线程处于了冻结状态。
  141. 就不会读取到标记。那么线程就不会结束。

  142. 当没有指定的方式让冻结的线程恢复到运行状态是,这时需要对冻结进行清除。
  143. 强制让线程恢复到运行状态中来。这样就可以操作标记让线程结束。

  144. Thread类提供该方法 interrupt();
  145. */

  146. /*
  147. 守护线程
  148. 又名用户现场,后台线程。
  149. setDaemon(boolean):将线程标记为后台线程,后台线程和前台线程一样,开启,一样抢执行权运行,
  150.         只有在结束时,有区别,当前台线程都运行结束后,后台线程会自动结束。
  151.         该方法在start前调用。
  152. 把前面结束线程的例子改动一下。
  153. */

  154. /*
  155. class StopThread implements Runnable
  156. {
  157.         boolean flag = true;//定义标记控制循环结构

  158.         //覆盖run方法,
  159.         public void run()
  160.         {
  161.                 while(flag)
  162.                         System.out.println(Thread.currentThread().getName()+"...run");//打印调用run方法的线程名
  163.         }
  164. }


  165. class StopThreadDemo
  166. {
  167.         public static void main(String[] args)
  168.         {
  169.                 StopThread st = new StopThread();//建立实现了Runnable接口的类的对象
  170.                 Thread t1 = new Thread(st);//建立线程1
  171.                 Thread t2 = new Thread(st);//建立线程2
  172.                 t1.setDaemon(true);//标记线程1为后台线程
  173.                 t2.setDaemon(true);//标记线程2为后台线程
  174.                 t1.start();//启动线程1,调用run方法
  175.                 t2.start();//启动线程2,调用run方法

  176.                 //定义一个循环,等线程1和线程2运行一会儿之后,主线程再把标记flag改为false
  177.                 int num = 0;
  178.                 while(true)
  179.                 {
  180.                         if(num++ == 50)
  181.                         {       
  182.                                 break;//改变标记后,立刻结束主线程的while循环
  183.                         }
  184.                         System.out.println(Thread.currentThread().getName()+"......run"+num);//展示主线程执行的结果
  185.                 }
  186.                 System.out.println("over");//表示主线程执行完毕
  187.         }
  188. }
  189. */
  190. /*
  191. 运行结果
  192. Thread-0...run
  193. Thread-1...run
  194. main......run50
  195. Thread-1...run
  196. Thread-0...run
  197. Thread-1...run
  198. over
  199. Thread-1...run
  200. 结果显示:当主线程结束之后,线程1和线程2立刻结束了
  201. */
复制代码


1 个回复

倒序浏览
笔记要天天做啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马