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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 少年闰土 中级黑马   /  2015-6-13 20:11  /  855 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

线程停止:只有一种,run方法结束。开启多线程运行,运行代码通常是循环结构。只要控制住循环(测试条件),就可以让run方法结束,也就是线程结束。

特殊情况:
当线程处于了冻结状态。就不会读取到标记。那么线程就不会结束。
当没有指定的方式让冻结的线程恢复到运行状态是,这时需要对冻结进行清除。强制让线程恢复到运行状态中来。这样就可以操作标记让线程结束。Thread类提供该方法 interrupt();

下面是对上面想法的代码实现:

  1. public class StopThreadDemo {
  2.         public static void main(String[] args) {
  3.                 MyThd t = new MyThd();
  4.                 Thread t1 = new Thread(t);
  5.                 Thread t2 = new Thread(t);
  6.                 t1.start();
  7.                 t2.start();
  8.                 try {
  9.                         Thread.sleep(1000);
  10.                 } catch (InterruptedException e) {
  11.                         e.printStackTrace();
  12.                 }
  13.                 System.out.println("main end");
  14.                 t1.interrupt();//给t1线程清除中断状态
  15.         }

  16. }

  17. class MyThd implements Runnable {
  18.         Object obj = new Object();
  19.         int tick = 100;
  20.         boolean stop = false; //停止标志
  21.        
  22.         public void run() {
  23.                 while(!stop) {
  24.                         synchronized (obj) {       
  25.                                 if (tick > 0) {
  26.                                         try {
  27.                                                 Thread.sleep(100);
  28.                                                 System.out.println(Thread.currentThread().getName() + "......" + tick--);
  29.                                         } catch (InterruptedException e) {
  30.                                                 //当收到InterruptedException异常时设置停止标志,在下次循环时会检测到stop,结束线程
  31.                                                 System.out.println(Thread.currentThread().getName() + "    " + e.getMessage());
  32.                                                 stop = true;
  33.                                         }
  34.                                 }
  35.                         }       
  36.                 }
  37.                 System.out.println(Thread.currentThread().getName() + "  停止");
  38.         }
  39. }

复制代码
但是在这段代码中有点问题,当主线程给两个子线程中任意子线程清除中断状态时,两个子线程都会结束,有没有什么办法能准确的控制要结束的子线程,不必两个都结束呢?


1 个回复

倒序浏览
。。。。。。表示也在学习中啊。。。。。。。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马