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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 匡文 中级黑马   /  2013-10-25 18:10  /  1197 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 匡文 于 2013-10-26 14:51 编辑

复习线程的时候,发现Thread 的stop()方法已过时,又没有提供新方法停止线程,那除了while()循环的条件结束这种方式停止线程以外,还有别的方法停止线程吗?

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

2 个回复

正序浏览
    当然有了!
    特殊情况下,当线程处于冻结状态,就不会读取标记,也就不能结束线程。这时,当你想要结束该线程时,你可以使用Thread类中的interrupt();方法,它将会抛出一个InterruptedException,这时,你就可以在catch语句快中修改标记,使线程停止。代码举例如下
  1. class Demo implements Runnable
  2. {        private boolean flag = true;
  3.         public synchronized void run(){
  4.                 while(flag)
  5.                 {
  6.                         try
  7.                         {
  8.                                 wait();//此处该线程会冻结,无法继续,除非有人唤醒它
  9.                         }
  10.                         catch(InterruptedException e)
  11.                         {
  12.                                 flag = false;//执行t.interrupt()方法后会捕获到该异常,然后执行catch中的语句,改变标记位,使循环结束
  13.                         }
  14.                        
  15.                 }
  16.         }
  17. }
  18. class Test
  19. {
  20.   public static void main(String[] args)
  21.   {
  22.         Demo d = new Demo();
  23.         Thread t = new Thread(d);
  24.         t.start();
  25.         for(int x = 0;x<60;x++)
  26.         {
  27.                 System.out.println(x+"............");
  28.                 if(x == 50)
  29.                         t.interrupt();//当for循环中x=50时,打乱t线程的冻结状态,使其抛出InterruptedException异常
  30.         }
  31.         System.out.println("the Main is Over");
  32.   }
  33. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
如果真的需要终止一个线程,可以使用以下几种方法:
1、让线程的run()方法执行完,线程自然结束。(这种方法最好)


2、通过轮询和共享标志位的方法来结束线程,例如while(flag){},flag的初始值设为真,当需要结束时,将flag的值设为false。(这种方法也不很好,因为如果while(flag){}方法阻塞了,则flag会失效)




复制代码 代码如下:
public class SomeThread implements Runnable {

private volatile boolean stop = false;

public void terminate() {

stop = ture;

}

public void run() {

while(stop) {

// ... some statements

}

}

}




如果线程因为执行sleep()或是wait()而进入Not Runnable状态,假如是wait() 用标志位就方法就不行了,

public final void wait(long timeout)
                throws InterruptedException此方法导致当前线程(称之为 T)将其自身放置在对象的等待集中,然后放弃此对象上的所有同步要求。即当前线程变为等待状态

wait() 的标准使用方法

synchronized(obj){

while(<不满足条件>){

obj.wait();

}

满足条件的处理过程

}

而您想要停止它,您可以使用第三种即

3 使用interrupt(),而程式会丢出InterruptedException例外,因而使得执行绪离开run()方法,

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马