我该如何调用线程本身?

时间:2010-12-27 02:37:47

标签: java multithreading

让我们说我是调用进程的主要方法。现在,如果这个过程被卡住或花费太长时间,通常可以通过中断线程来中断它。

但是如果我在main方法中实现它而不是在任何外部线程中,我如何调用当前线程本身进行中断,就像我们称之为thread.interupt();

5 个答案:

答案 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()将其删除。
  • 此时,第一个帖子应该打开EOF或IOException(关闭流) 流程的输出流。