使用给定的执行时间启动线程

时间:2009-05-07 10:29:29

标签: java multithreading timer kill execution

我的主进程调用外部库方法。这种方法有时会挂起。我无法修复外部库,因为另一家公司对此负责。

我想使用Thread来定义执行计时器的库调用。当方法调用变为long时,具有放置方法调用的Runnable的Thread应该停止,主进程应该继续。

  1. 主线程等待
  2. 执行线程
    • start启动计时器线程
    • 当计时器线程结束时,执行杀死执行线程
  3. 执行Thread stop Main
  4. 线程简历
  5. 有没有人有这个逻辑的代码,我可以使用的设计模式或我可以阅读一些信息的网页?

    由于

3 个答案:

答案 0 :(得分:2)

这将使线程完成等待最多30秒。

Thread t = new Thread() {
  public void run() {
    badExternalMethod();
    synchronized (this) {
      notifyAll();
    }
  }
};

synchronized (t) {
  t.start();
  try {
    t.wait(30000); // 30 secs
  } catch (InterruptedException e) {
    e.printStackTrace();
  }
}

// t已完成或超时

答案 1 :(得分:2)

查看Java 5及更高版本中的java.lang.concurrent包,特别是CompletionService接口以及实现它的类。

此界面包含允许您提交任务并等待其完成的调用,或者在超时后继续。

答案 2 :(得分:1)

30秒后,您将无法神奇地使正在运行的线程停止;您需要做的是让该线程在时间结束后检查一些状态,注意它花了太长时间并且从其运行方法return

大致有两种方法可以做到这一点:

  1. 让库调用线程以“块”执行其操作,每个块花费少量时间,并检查每个块之间的状态。例如,如果您正在处理数十万条记录,则可以在一个批处理中处理几百个,然后检查该标记。或者,如果您正在使用超时可能阻止呼叫,请将超时设置为500毫秒并检查每次呼叫之间的标记。
  2. 让主线程在时间到期时中断库调用线程,并确保库线程正确处理中断并在这种情况下检查标志。这将要求库调用线程执行可中断的方法,但任何可能长时间运行的方法都应该允许中断。
  3. 在这两种情况下,你需要有一个线程(可能是主线程,因为它没有别的办法)一旦时间到了就把“stop”标志设置为true(这个变量应声明为volatile,以便所有线程都能看到更新。同样,当库调用线程将此标志视为true时,它应该停止正在执行的操作,通常是从run()方法返回。

    你不应该从主线程中杀死库线程;请参阅Why are Thread.stop, Thread.suspend and Thread.resume Deprecated了解原因,以及一个看起来非常类似于我上面所述的替代方案。 : - )