关于Java线程超时退出的问题.

小弟近来有个任务是这样的,JAVA主程序中开启一个线程,我希望在一定的时间范围内 如果这个线程还没有运行完,就采取一些方法主动将他干掉,试了网上很多的方法都没有用,顶多是能抛出个异常,通知一下超时,但是线程还是在继续运行。
请教各位大虾们该怎么解决啊!!!
就没有哪个神人,能解决这个问题么. 我开的这个线程可能是要和别的程序进行交互,交互过程中可能会卡死,所以我才想能不能采取一些方法将他主动停掉,你们介绍的方法都不行...

结贴了吧.

第1个回答  推荐于2016-10-22
你在捕捉到的异常中,调用一下线程的interrupt()方法就可以对线程进行中断,当然,你的线程中的run方法中不能catch了interrupt()异常并且忽视这个异常。

比如在出现异常的地方:
threadA.interrupt();

而threadA的run方法中:
public void run() {
while(true) {
try {
....
} catch (InterruptedException) {
break; //这样是可以的,如果没有break或者修改为continue则不行
}
}
}

也可以将这个放在while循环之外。
public void run() {
try {
while(true) {

....
}
} catch (InterruptedException) {
....
}
}本回答被提问者采纳
第2个回答  2010-07-13
class AutoCloseThread implements Runnable{
private int limit;//限制
private Timer timer=new Timer();

@Override
public void run() {
TimerTask task=new TimerTask() {
@Override
public void run() {
limit++;
if(limit>50) timer.cancel();
}
};
timer.schedule(task, 0, 1000);
timer.schedule(task, 0);
}

}
shaoyunlu 2010-7-13 17:31:19
timer.schedule(task, 0, 1000);
timer.schedule(task, 0);
这两个 要一起写?
军 2010-7-13 17:44:31
不是
军 2010-7-13 17:44:43
timer.schedule(task, 0, 1000);
timer.schedule(“webservice”, 0);

参考资料:还有其他问题的话,给我发百度消息

第3个回答  2010-07-13
java.util.concurrent.Future
默认实现java.util.concurrent.FutureTask
你去查一下有关这个类的用法吧,他能满足你的要求。
或者java.util.concurrent.ExecutorService这个线程池也行。
第4个回答  2010-07-19
线程中run()写法类似下面
public void run()
{
....
while(t<毫秒)

。。。。。
}//程序结束


在while里设置线程停止条件,我这个是判断时间。也可以设置一个标识,例如:
public void run()
{
boolean isEnd = false;
.....
while(isEnd == false)
{
if(....)
{
isEnd = true;
break;
}
......
}
}

有空看看《JAVA多线程设计》,好书,结合设计模式讲的JAVA多线程。浅显易懂

===============补充你的补充问题==============

你既然说是想主动停掉。这个意思已经很明显了,你现在的问题只是,你在代码设计思路上陷入死循环了。
所谓主动停掉就是到了指定的条件,程序自然死亡结束。你要做的就是写一个销毁方法,将线程结束的所有操作都写在里面,包括你调用或交互的其它程序结束方法。然后在指定条件下调用这个销毁操作。我不知道我说的明白不?

关于Java线程超时退出的问题.
你在捕捉到的异常中,调用一下线程的interrupt()方法就可以对线程进行中断,当然,你的线程中的run方法中不能catch了interrupt()异常并且忽视这个异常。比如在出现异常的地方:threadA.interrupt();而threadA的run方法中:public void run() { while(true) { try { ...} catch (InterruptedException) ...

java 任务执行超时后,终止正在执行的任务
在A中设置B的初始状态为“未超时”,在B中超时的话就把状态置为“已超时”。然后A的判断初始阶段加一个对B状态的判断,如果B是“未超时”状态程序往下走,否则直接退出。PS:对提及多线程的那位仁兄表示匪夷所思,感觉跟多线程没有关系。

java写文件流返回线程超时
java写文件流返回线程超时可以进行中断处理,包括中断线程并且返回超时的结果,有时候线程已经在执行了,是无法中断的,程序要返回超时的结果。Java是一门面向对象编程语言,1990年代初由詹姆斯·高斯林等人开发出Java语言的雏形,最初被命名为Oak,后随着互联网的发展,经过对Oak的改造,1995年5月Java正式...

请问如何让java执行某条语句超时时跳过该语句(或抛出异常)
放到线程里(比如:Thread)执行 然后线程.join(2000);等待2秒,捕捉中断异常即可,到了两秒会触发中断异常,然后继续往下走

java使用线程操作,等待线程后续时间过长报超时异常,如何操作使线程推出...
java中使用用线程控制Task任务,启动下面的线程就可以了,new Thread(new Task()).start() ;public class Task implements Runnable {\/\/新建一个任务 private TextArea textArea;public Task(TextArea textArea){ this.textArea = textArea;} public void run() { while (true) { this.textArea....

如何关闭java线程
sleep(5000); \/\/ 主线程延迟5秒 thread.exit = true; \/\/ 终止线程thread thread.join();System.out.println("线程退出!");} } 在上面代码中定义了一个退出标志exit,当exit为true时,while循环退出,exit的默认值为false.在定义exit时,使用了一个Java关键字volatile,这个关键字的目的是使exit...

请教java线程池没有运行完就自动退出了,我也没有去关闭。。
线程的调度和使用方式没有任何问题,Thread.sleep(2*1000);也没有任何必要,因为这样写阻塞的只是主线程。问题应该是处在AxsInfoThread类中,是不是这个类的run方法中的任务已经执行完了,或者其内部又开启了新线程。

java 如何调用方法里超过10秒就终止该方法,不往下执行,防止线程阻塞
本来用DWR调用方法就是多线程的,线程总数与J2EE容器配置的有关。建议如下:如果你这个A()调用的接口一次只允许一个访问,那么需要在A所在的类里设置一个静态成员变量,如static String object = "some"。然后在A()方法一开始用synchronized (object){..}把代码都包含进来。这样可以确保一次只有一个...

java 如何调用方法里超过10秒就终止该方法,不往下执行,防止线程阻塞
本来用DWR调用方法就是多线程的,线程总数与J2EE容器配置的有关。建议如下:如果你这个A()调用的接口一次只允许一个访问,那么需要在A所在的类里设置一个静态成员变量,如static String object = "some"。然后在A()方法一开始用synchronized (object) {.. }把代码都包含进来。这样可以确保一次只有一个...

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

相似回答