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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 水蛭31 中级黑马   /  2015-6-19 11:55  /  411 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

多线程——停止线程
首先开启多个线程运行, 一般运行的代码通常是循环结构。如果需要让线程停止,
只要控制住循环, 就可以让run方法结束了。
让线程停止,这里用到的是intterupt(),以前用的是stop(),但是目前已经停用了。
intterupt()表示强制清除冻结状态,让线程回复到运行状态中来,不是结束线程。
相当于:这时把他给催眠(wait())了, 但是这时催眠的人出国了, 我来了, 一砖头(intterupt())下去,
受伤了, 发生异常了,叫做人家不该醒, 你让他醒,就异常了。
但是这样还是不能让程序结束, 但是能让他执行, 就离程序结束不远了,
在异常的处理语句中, 让flag变成false, 这样while循环就结束了, 那么这个线程就结束了,

  1. class StopThread implements Runnable
  2. {
  3.         private boolean flag=true;
  4.         public synchronized void run(){
  5.                 while(flag){
  6.                         try
  7.                         {
  8.                                 wait();//这样线程处于冻结状态,主函数结束,但是程序没有结束
  9.                                 //本来冻结了,但是一砖头(interrupt()),打醒了,就抛出异常
  10.                         }
  11.                         catch (InterruptedException e)
  12.                         {
  13.                                 System.out.println(Thread.currentThread().getName()+".....Exception");
  14.                                 flag=false;//一砖头打醒后,会执行,那么while就不会执行了,
  15.                         }
  16.                         System.out.println(Thread.currentThread().getName()+".....run");
  17.                 }
  18.         }
  19.         public void changeFlag(){
  20.                 flag=false;
  21.         }
  22. }
  23. class Threadstop
  24. {
  25.         public static void main(String[] args)
  26.         {
  27.                 StopThread st=new StopThread();
  28.                 Thread t1=new Thread(st);       
  29.                 Thread t2=new Thread(st);
  30.                 t1.start();
  31.                 t2.start();
  32.                 int num=0;
  33.                 while(true){
  34.                         if(num==60){
  35.                                 t1.interrupt();
  36.                                 t2.interrupt();
  37.                                 //st.changeFlag();
  38.                                 break;
  39.                         }
  40.                 System.out.println(Thread.currentThread().getName()+"...."+num++);
  41.                 }
  42.                 System.out.println("over");
  43.         }
  44. }
复制代码
总结:
当没有指定的方式让冻结的线程恢复到运行的状态时, 这时, 需要对冻结进行清除,强制让线程恢复到运行状态中来, 这样就可以让操作标记让线程结束,
Thread类中提供了该方法,Intertupt




1 个回复

倒序浏览
谢谢分享。。。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马