繁体   English   中英

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

[英]Start Thread with a given execution time

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

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

  1. 主线程等待
  2. 执行线程
    • 启动启动计时器线程
    • 当计时器线程完成时,杀死执行线程
  3. 执行Thread stop Main
  4. 线程简历

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

谢谢

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

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

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

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

这有两种方法:

  1. 让库调用线程以“块”执行其操作,每个块花费少量时间,并检查每个块之间的状态。 例如,如果您正在处理数十万条记录,则可以在一个批处理中处理几百个,然后检查该标记。 或者,如果您正在使用超时可能阻止呼叫,请将超时设置为500毫秒并检查每次呼叫之间的标记。
  2. 让主线程在时间到期时中断库调用线程,并确保库线程正确处理中断并在这种情况下检查标志。 这将要求库调用线程执行可中断的方法,尽管任何可能长时间运行的方法都应该允许中断。

在这两种情况下,你需要有一个线程(可能是主线程,因为它没有别的办法)一旦时间到了就将“stop”标志设置为true (并且这个变量应该被声明为volatile,所以更新被所有线程看到)。 同样,当库调用线程将此标志视为true时,它应该停止它正在执行的操作,通常是从run()方法返回。

你不应该真正从主线程中杀死库线程; 请参阅为什么Thread.stop,Thread.suspend和Thread.resume由于这些原因而被弃用 ,以及一个看起来非常类似于我上面描述的替代方案。 :-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM