2013-04-10 18 views
0

在我的Thread类的run()方法中,我调用了一个永不结束的函数。 我需要该线程只运行一段特定的时间。销毁一个线程,具有永不结束的函数int其run()方法?

我们无法控制线程一旦启动,他们的任何方式来摧毁它?

我已经试过yield()sleep(),等...

PS - 我不能改变上房功能

+0

你试过打断它吗? – Eugene 2013-04-10 05:46:34

+0

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html#stop()? stop()虽然不推荐使用,但最好是编辑该函数,以便通过更改变量来停止它,这样每次都会在安全点停止 – Patashu 2013-04-10 05:46:47

+0

是的,我已经尝试过仍然没有成功 – user2211059 2013-04-10 05:47:05

回答

2

从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()绝不能在线程上调用。

这是程序员的责任,使长时间运行的方法响应中断。

0

这可能太多了,但这是我如何解决它,如果你不想惹中断。

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,如果它不是间隔内完成,基本上你杀了它 - 发送中断它。