【问题标题】:How to limit the execution time of a third-party Java method如何限制第三方Java方法的执行时间
【发布时间】:2014-11-18 08:11:12
【问题描述】:

在 Java 程序中,我需要执行第三方 Java 类的方法。我使用Class.forName 获取一个类,newInstance() 获取该类的一个对象:

Class  class  = Class.forName(className);
AClass object = (AClass) class.newInstance(); 

然后我执行并获得所需方法的结果

ResultObject result = object.method();

到目前为止,一切都很好。但是如果我想限制方法的执行时间就会出现问题(即,如果方法在给定的秒数后没有停止,我想终止这个执行并忽略结果)。

理想的解决方案是在单独的线程中运行该方法,如果该方法未及时完成,则停止并销毁该线程。但不幸的是,一个线程无法停止(它的 stop() 方法已被弃用),我不能依赖第三方方法的正确中断行为。

有没有其他方法可以执行一个方法并完全控制它的执行(即能够随时终止它)?我确信这是可能的——例如,Netbeans 可以执行我的类(当我运行我的应用程序时),如果我按下停止按钮,它可以杀死它。但是 Netbeans(或 Eclipse 或任何其他 IDE)如何做到这一点?

有什么想法吗?谢谢!

【问题讨论】:

  • Netbeans 在完全独立的 JVM 中运行您的应用程序。
  • 看看这个:stackoverflow.com/questions/2275443/how-to-timeout-a-thread。它说使用 ExecutorService 并通过 Future 对象如何停止线程的执行
  • 你对被调用的方法有控制权吗?
  • @MichaelZucchetta 这是个好主意,但可能行不通。 ExectuorService.shutdownNow() 明确指出以下内容: 除了尽力停止处理正在执行的任务之外,没有任何保证。例如,典型的实现将通过 Thread.interrupt() 取消,因此任何未能响应中断的任务都可能永远不会终止。
  • @DavidtenHove 没错,任务可能仍在后台运行,但至少调用方法不再等待其完成。如果我们可以假设任务不会永远运行,那么这个解决方案可能就足够了。

标签: java multithreading


【解决方案1】:

一种选择是不仅在单独的线程中,而且在单独的进程中运行第 3 方代码。这很麻烦,但是您可以随时终止该进程,并且保证可以正常工作。

【讨论】:

  • 旁注:您可以使用标准 I/O(通过流)与子进程通信,或者 - 如果您需要高度复杂的进程间通信 - 使用 RMI。
  • 关于它的有用问题:stackoverflow.com/questions/636367/…
  • 在单独的进程中运行代码到底意味着什么?使用Runtime.getRuntime().exec("java MyClass"); 运行它还是有其他方法可以做到这一点?
猜你喜欢
  • 2018-01-25
  • 1970-01-01
  • 2012-11-11
  • 2020-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-05
  • 2013-04-28
相关资源
最近更新 更多