JAVA 如何停止一个运行着的指定线程

如题,如何停止指定的线程?尽量给点示例代码
谢谢knightzhuwei的回答,我是这样的:这个线程我会让程序调用多次,也就是会生成很多个同时进行的相同的任务,如果是这样那所有的任务就会停止
如果是用线程的ID来实现这个功能要怎么处理??

楼主, 你虽然有很多个任务相同的线程,但其实这N个线程并不是同一个对象,
就好像,
人是一个类,有湖南,湖北,广东,广西人,
每个人都有一个身份标志。
你把湖南人的标志改了并不会影响到湖北人! 虽然他们都在同一个工地上干同样的活,虽然它们都是妈生的

所以本例中,N多个线程对象生成,并启动后一个一个都是单独的对象,在单独的运行空间里跑。表面上看起来是相同的任务,其实是不相同的
boolean runflag=true; 这个标志每个对象都有一个,你改变了其中一个以后,其它线程并不会受到影响;

那么如果我就是想达到改变一次就能停止所有线程呢? 方法是将runflag给设成static即 public static runflag=true;
这样这个runflag只会生成一次。改变一次就会影响全部对象。
就好像,湖南湖北人都只有一个祖国, 国家富强了,所有人都受益

如果要用id来管理线程也是可以的,用Hashtable来存储线程,Hashtable需要一个主键key,你在线程对象内生成一个不可能重复id传给它做主键就行了。
但即使这样,也不要随便使用sun不推荐使用的stop()方法停止线程,这样会造成很多不可预料的后果。 而还是应该使用改变runflag的形式
即:
myThread mt=(myThread)hashtable.get(id);
mt.runflag=false;

希望对你有所帮助
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-06-05
中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地中止其当前的操作。
线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序。虽然初次看来它可能显得简单,但是,你必须进行一些预警以实现期望的结果。你最好还是牢记以下的告诫。
首先,忘掉Thread.stop方法。虽然它确实停止了一个正在运行的线程,然而,这种方法是不安全也是不受提倡的,这意味着,在未来的JAVA版本中,它将不复存在。
中断线程最好的,最受推荐的方式是,使用共享变量(shared variable)发出信号,告诉线程必须停止正在运行的任务。线程必须周期性的核查这一变量(尤其在冗余操作期间),然后有秩序地中止任务。具体的示例代码如下:
class Example extends Thread {
volatile boolean stop = false;
public static void main( String args[] ) throws Exception {
Example2 thread = new Example2();
System.out.println( "Starting thread..." );
thread.start();
Thread.sleep( 3000 );
System.out.println( "Asking thread to stop..." );
thread.stop = true;
Thread.sleep( 3000 );
System.out.println( "Stopping application..." );
//System.exit( 0 );
}
public void run() {
while ( !stop ) {
System.out.println( "Thread is running..." );
long time = System.currentTimeMillis();
while ( (System.currentTimeMillis()-time < 1000) && (!stop) ) {
}
}
System.out.println( "Thread exiting under request..." );
}
}
第2个回答  2008-12-25
既然stop()是不被推荐的,那么我们如何停止一个线程呢?直接kill吗?在这里,笔者总结一种比较通用也比较稳定的方法:

class threadtest extend Thread{
//skip some code..

boolean runflag=true;

public synchronized void stopthread()
{
runflag=false;
}

public synchronized boolean getrunflag()
{
return runflag;
}

public void run() {
runflag=true;
try {
while (getrunflag()) {
code1;
code2;
//put your code here
}
}
}
catch (IOException e) {
e.printStackTrace();
}
System.out.println(this.getClass().getName()+" stopped");
}

//skip some code..
}

这样,每当需要停止该线程时,只需调用stopthread()即可。

这里有两点需要注意:

1)我们用了一个同步方法getrunflag()来得到当前的状态,为什么用这个方法而不是直接使用while(runflag)呢?
这个是因为在java的多线程模型中,有一个公共的对象存储区,但是每个对象都有自己的私有备份,当一个线程改变了状态,jvm并不能保证这个线程改变过的变量即时更新公共对象存储区的状态,可能(可能性不大)造成问题。
所以建议有好的设计习惯,采用同步方法来获得当前的runflag值。

2)还有一点,特别是涉及网络的多线程,如果发生了网络阻塞(在while循环里面发生),那么,即使runflag状态比如改变成false,由于程序被阻塞,线程用这种方法是永远都不会被停止的。
举个例子:比如上面的程序,如果code1是一段网络程式,如果在code1发生了阻塞,阻塞的意义就是得不到请求的
资源,在无限期等待,这个时候,runflag状态的变化对while循环是起不了作用的,线程不会被停止。
笔者曾经参与多个涉及到获取网络资源的java程式,经常遇到因为网络的阻塞引起的线程问题。
如果你的程式可能涉及到网络阻塞,或者有可能发生某种消息接受的阻塞。那么,请不要用这种方法来停止线程。具体方法请看笔者另外一片文章:高级多线程编程(二)-多线程中的监控与超时问题。

如果该线程中不需要循环,只是执行一次的,例如有数据库的操作,但是执行到一半的时候要中止这个线程,那就需要断开数据库的连接。
第3个回答  2008-12-26
系统内建HASHMAP,在生成线程的时候分配ID为KEY,并将该线程存入该HASHMAP,当需要停止时,从HASHMAP中根据该ID取出线程的引用,并停止,这样应该能够实现你的要求~
第4个回答  2008-12-26
xiliantian 仁兄说的对极了,用HashMap来管理就OK了
相似回答