我的主进程调用外部库方法。这种方法有时会挂起。我无法修复外部库,因为另一家公司对此负责。
我想使用Thread来定义执行计时器的库调用。当方法调用变为long时,具有放置方法调用的Runnable的Thread应该停止,主进程应该继续。
有没有人有这个逻辑的代码,我可以使用的设计模式或我可以阅读一些信息的网页?
由于
答案 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
。
大致有两种方法可以做到这一点:
在这两种情况下,你需要有一个线程(可能是主线程,因为它没有别的办法)一旦时间到了就把“stop”标志设置为true
(这个变量应声明为volatile,以便所有线程都能看到更新。同样,当库调用线程将此标志视为true时,它应该停止正在执行的操作,通常是从run()方法返回。
你不应该从主线程中杀死库线程;请参阅Why are Thread.stop, Thread.suspend and Thread.resume Deprecated了解原因,以及一个看起来非常类似于我上面所述的替代方案。 : - )