在我run()
的 Thread 类的方法中,我正在调用一个永无止境的函数。我需要线程只运行特定的持续时间。
线程一旦启动就无法控制,他们有什么办法破坏它吗?
我试过了yield()
,,sleep()
等等……
PS - 我无法更改永无止境的功能
在我run()
的 Thread 类的方法中,我正在调用一个永无止境的函数。我需要线程只运行特定的持续时间。
线程一旦启动就无法控制,他们有什么办法破坏它吗?
我试过了yield()
,,sleep()
等等……
PS - 我无法更改永无止境的功能
来自 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()
绝不能在线程上调用。
使长时间运行的方法响应中断是程序员的责任。
http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html回答了你所有的问题.. 特别是部分我应该使用什么来代替 Thread.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 中,如果它没有在间隔内完成,你基本上会杀死它 - 将中断发送给它。