0

在我run()的 Thread 类的方法中,我正在调用一个永无止境的函数。我需要线程只运行特定的持续时间。

线程一旦启动就无法控制,他们有什么办法破坏它吗?

我试过了yield(),,sleep()等等……

PS - 我无法更改永无止境的功能

4

3 回答 3

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

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

于 2013-04-10T05:50:13.530 回答
0

http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html回答了你所有的问题.. 特别是部分我应该使用什么来代替 Thread.stop?

希望能帮助到你

于 2013-04-10T05:49:01.203 回答
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 中,如果它没有在间隔内完成,你基本上会杀死它 - 将中断发送给它。

于 2013-04-10T05:59:52.153 回答