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

Java 以给定的执行时间启动线程,java,multithreading,timer,kill,execution,Java,Multithreading,Timer,Kill,Execution,我的主进程调用一个外部库方法。这种方法有时会挂起。我无法修复外部库,因为它由另一家公司负责 我想使用一个线程来调用具有定义的执行计时器的库。当方法调用花费很长时间时,放置方法调用的可运行线程应该停止,主进程应该继续 主线程等待 执行线程 启动计时器线程 当计时器线程完成时,终止执行线程 执行线程停止主线程 线程恢复 有没有人有这种逻辑的代码,我可以使用的设计模式,或者我可以阅读一些信息的网页 谢谢这将等待30秒,线程才能完成 Thread t = new Thread() { publi

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

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

  • 主线程等待
  • 执行线程
    • 启动计时器线程
    • 当计时器线程完成时,终止执行线程
  • 执行线程停止主线程
  • 线程恢复
  • 有没有人有这种逻辑的代码,我可以使用的设计模式,或者我可以阅读一些信息的网页


    谢谢

    这将等待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已完成或超时

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

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

  • 让库调用线程在每次占用少量时间的“块”中执行其操作,并检查每个块之间的状态。例如,如果您正在处理数十万条记录,您可能会在一批中处理几百条记录,然后检查标志。或者,如果您正在进行有超时的潜在阻塞呼叫,请将超时设置为500毫秒,并检查每次呼叫之间的标志
  • 让主线程在时间结束时中断库调用线程,并确保库线程正确处理中断,并在这种情况下检查标志。这需要库调用线程执行一个可中断的方法,尽管任何潜在的长时间运行的方法都应该允许中断
  • 在这两种情况下,您都需要让其中一个线程(可能是主线程,因为它没有其他事情要做)在时间结束后将“stop”标志设置为
    true
    (该变量应声明为volatile,以便所有线程都能看到更新)。类似地,当库调用线程看到此标志为true时,它应该停止正在执行的操作,通常通过从run()方法返回


    您不应该真的从主线程杀死库线程;请参阅以了解原因,以及一个与我上面描述的非常类似的替代方案。:-)

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


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

    我想您指的是t.join(30000)而不是t.wait(30000)。谢谢,我将测试代码,看看外部库发生了什么,哪些资源没有被处理。我想,当外部调用挂起时,我将优雅地终止主进程。我不知道外部库在做什么,所以我不能说当我杀死线程时发生了什么。