让我们说我是调用进程的主要方法。现在,如果这个过程被卡住或花费太长时间,通常可以通过中断线程来中断它。
但是如果我在main方法中实现它而不是在任何外部线程中,我如何调用当前线程本身进行中断,就像我们称之为thread.interupt();
答案 0 :(得分:1)
请备份一秒钟。 Thread.interrupt只中断等待条件,而不是计算。没有用于中断计算的Java构造(监视/调试代理除外)。
因此,如果您希望长时间运行的计算可以中断,则必须编写它以便经常仔细检查中断。
如果您希望能够完全从进程外“中断”,则需要处理信号。这是关于我对主线程问题的唯一解释。
This blog post(不是我的)有基本信息。从处理程序,您可以中断,例如,主线程。
答案 1 :(得分:1)
你可以让另一个线程中断“你”(主)。像这样:
final Thread me = Thread.currentThread();
Thread wake_me_up = new Thread(){
@Override
public void run(){
//InterruptionException try catch omitted.
Thread.sleep(200);
me.interrupt();
}
};
wake_me_up.start();
try{
go_into_cave();
}catch(InterruptedException e){
//I got interrupted
System.out.println("thank you, you saved my life");
}
go_home();
虽然我觉得很难读懂......
答案 2 :(得分:0)
在main方法中,您将引用所有线程。只需获得正确的参考,并做这样的事情
someThread.interrupt();
确保您不要忘记检查正在运行的线程是否获得中断标志设置为true。 例如,在它的方法的中间,需要检查它自己是否由某个线程的其他线程()继续
if(Thread.currentThread().isInterrupted()){
doSomeStuff();
}
答案 3 :(得分:0)
您可以创建一个新线程并从新线程内部调用您的进程。中断此线程并根据您的逻辑捕获异常。
我不确定如何只在main方法中执行此操作,但是如果通过方法调用进程调用,只需从新线程调用此方法并在main方法中设置计时器。一旦计时器到期,中断该线程就可以了。
答案 4 :(得分:0)
如果你试图杀死这个过程,因为它已挂起,为什么你甚至担心线程呢? Runtime.exec()
返回一个Process
对象,您可以使用它来销毁子进程。你应该能够:
Process
对象。Process.getInputStream()
。所以,继续这样做。Process.destroy()
将其删除。IOException
(关闭流)
流程的输出流。