【发布时间】: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