在我的Thread类的run()
方法中,我调用了一个永不结束的函数。 我需要该线程只运行一段特定的时间。销毁一个线程,具有永不结束的函数int其run()方法?
我们无法控制线程一旦启动,他们的任何方式来摧毁它?
我已经试过yield()
,sleep()
,等...
PS - 我不能改变上房功能
在我的Thread类的run()
方法中,我调用了一个永不结束的函数。 我需要该线程只运行一段特定的时间。销毁一个线程,具有永不结束的函数int其run()方法?
我们无法控制线程一旦启动,他们的任何方式来摧毁它?
我已经试过yield()
,sleep()
,等...
PS - 我不能改变上房功能
http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html回答你所有的问题..特别是部分我应该用什么使用Thread.stop,而不是?
希望它可以帮助
答案您的答案还应包含一些解释。这看起来只是链接不适合的答案。 – 2013-04-10 05:53:37
好的..谢谢Narendra,我会尽力给出更详细的答案:) – 2013-04-10 05:59:00
从Oracle的Java文档:每个循环之后
public void run(){
for (int i = 0; i < inputs.length; i++) {
heavyCrunch(inputs[i]);
if (Thread.interrupted()) {
// We've been interrupted: no more crunching.
return;
}
}
}
你的线程应该检查中断状态,看它是否被打断。如果你调用的方法只是while(true){}
,那么恐怕没有办法打断它,并且stop()
绝不能在线程上调用。
这是程序员的责任,使长时间运行的方法响应中断。
这可能太多了,但这是我如何解决它,如果你不想惹中断。
public class ThreadTest {
public static void main(String[] args) throws InterruptedException {
ThreadTest test = new ThreadTest();
test.go();
}
void go() throws InterruptedException{
ExecutorService service = Executors.newSingleThreadExecutor();
service.execute(new LongRunnable());
if(!service.awaitTermination(1000, TimeUnit.MILLISECONDS)){
System.out.println("Not finished within interval");
service.shutdownNow();
}
}
}
class LongRunnable implements Runnable {
public void run(){
try{
//Simultate some work
Thread.sleep(2000);
} catch(Exception e){
e.printStackTrace();
}
}
}
基本上你是你的包裹可运行在ExecutorServie,如果它不是间隔内完成,基本上你杀了它 - 发送中断它。
你试过打断它吗? – Eugene 2013-04-10 05:46:34
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html#stop()? stop()虽然不推荐使用,但最好是编辑该函数,以便通过更改变量来停止它,这样每次都会在安全点停止 – Patashu 2013-04-10 05:46:47
是的,我已经尝试过仍然没有成功 – user2211059 2013-04-10 05:47:05