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了

Java中如何终止运行中的线程?while(true){i++;}死循环是如何跳出的?
Java中,终止线程通常意味着在线程处理任务完成之前停止当前操作。有三种方法可以终止正在运行的线程:首先,可以使用volatile标志位。创建一个Runnable接口的实现类,其中定义一个volatile标志位,利用这个标志位控制线程的运行。在main方法中创建线程,适当时候修改标志位以终止线程。其次,可以使用interrupt()方法...

Java线程停止的方法,及stop等方法为什么被废弃
在 Java 中有以下 3 种方法可以终止正在运行的线程:停止一个线程的推荐做法是修改某些变量以指示目标线程应停止运行。 目标线程应定期检查此变量,如果该变量指示要停止运行,则应有序地从其运行方法返回。 这是为了确保对 stop-request 进行及时的通信,变量必须是 volatile 或者必须同步访问变量。使用 ...

Java中如何停止一个线程
终止线程的三种方法:1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。 2. 使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。3. 使用interrupt方法中断线程。 1. 使用退出标志终止线程 当run方法执行完后,线程就会退出。但...

怎样在java中关闭多线程其中一个线程?让其他线程还正常运行?
如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个 InterruptedException。 如果该线程在可中断的通道上的 I\/O 操作中受阻,则该通道将被...

到底怎么关闭java的线程啊!!我疯了!
多线程一旦跑起来是无法控制的 一切皆有可能 所以一般结果也是有很多情况 想要停掉线程有下面几种情况:线程的run()方法里面的代码运行结束 线程运行到一半出现异常 异常没有相应的代码捕获处理的话 该线程宣布死亡 但不影响其他线程的运行 停止java虚拟机 ...

java中终止程序的执行
方案操作如下:(1)让程序在一个单独的线程中运行,然后在终止时,可以用线程的终止方法来结束它。(2)退出Java程序时尽量不要使用java.lang.System的exit方法。Exit 方法可以终止JVM,从而终止程序,但如果同时运行了另一个Java程序,使用exit方法就会让该程序也关闭,这显然不是希望看到的情况!!!要...

哪些情况可以终止当前线程的运行
线程可以通过多种方式终止其运行,包括正常结束、异常抛出、使用线程中断以及任务超时等。1. 正常结束:线程运行完其对应的任务后,会自然结束。在Java、Python等编程语言中,当线程的run方法执行完毕,线程就会正常结束。例如,在Java中,我们可以创建一个Thread实例,并覆写其run方法,当run方法执行完毕,...

java重启时没有结束的线程会自动终止吗?
在Java服务正常关闭或重启时,未执行完的线程会被中止。但是,这并不意味着线程会立即终止或丢失。在一个正常关闭或重启的过程中,Java虚拟机会尝试以一种安全的方式停止所有的线程。正常关闭:当你调用System.exit()或者通过其他方式(例如:在Spring Boot应用中使用\/shutdown端点)正常关闭应用时,Java...

java 怎么强制关闭 一个线程 ?
\\x0d\\x0a如果真的需要终止一个线程,可以使用以下几种方法: \\x0d\\x0a1、让线程的run()方法执行完,线程自然结束。(这种方法最好)\\x0d\\x0a\\x0d\\x0a2、通过轮询和共享标志位的方法来结束线程,例如while(flag){},flag的初始值设为真,当需要结束时,将flag的值设为false。(这种方法也...

在java中什么办法可以让线程停止然后再重新启动它
1.你可以用布尔值来控制是否让线程运行。例:while(boolean isLive){} 当isLive为true线程就运行,否则不运行。2.你可以用对象。例:while(Object o != null)当对象存在的时候线程就运行,否则不运行!3.你可以用wait()方法来让线程等待,然后用notify()、notifyAll()在适当的时候唤醒线程、或者...

相似回答