代码之家  ›  专栏  ›  技术社区  ›  Markus Lausberg

以给定的执行时间启动线程

  •  4
  • Markus Lausberg  · 技术社区  · 16 年前

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

    我想使用一个线程来调用具有定义的执行计时器的库。当方法调用花费很长时间时,放置方法调用的可运行线程应该停止,主进程应该继续。

    1. 主线程等待
      • 启动计时器线程
      • 当计时器线程完成时,终止执行线程
    2. 线程恢复

    有没有人有这种逻辑的代码,我可以使用的设计模式,或者我可以阅读一些信息的网页?

    谢谢

    3 回复  |  直到 16 年前
        1
  •  2
  •   Merzbow Merzbow    16 年前

    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已完成或超时

        2
  •  2
  •   Bill Michell    16 年前

    看一看 java.lang.concurrent Java 5及更高版本中的包,特别是 CompletionService

    此接口包括允许您提交任务并等待其完成或在超时后继续的调用。

        3
  •  1
  •   Andrzej Doyle    16 年前

    你将无法神奇地使运行的线程在30秒后停止;您需要做的是在时间结束后使线程检查处于某种状态,注意它花费的时间太长并且 return

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

    1. 让主线程在时间结束时中断库调用线程,并确保库线程正确处理中断,并在这种情况下检查标志。这需要库调用线程执行一个可中断的方法,尽管任何潜在的长时间运行的方法都应该允许中断。

    true 一旦时间到了(这个变量应该声明为volatile,以便所有线程都能看到更新)。类似地,当库调用线程看到此标志为true时,它应该停止正在执行的操作,通常通过从run()方法返回。

    您不应该真的从主线程杀死库线程;看见 Why are Thread.stop, Thread.suspend and Thread.resume Deprecated