gpt4 book ai didi

java - 取消我没有写的动态加载的 Callable

转载 作者:行者123 更新时间:2023-11-29 03:44:31 29 4
gpt4 key购买 nike

我有一些代码可以从目录中的多个 JAR 动态加载类。因为 JAR 中的代码是不受信任的,所以我希望通过对它们进行“沙盒处理”来保护主应用程序免受编码不良或恶意动态类的影响。我想做的一件事是“时间盒”不受信任的代码的执行,如果花费的时间太长(例如,因为它陷入了无限循环),则将其杀死。我正在尝试使用 Callable 和 Future 来实现它,不是因为我想并行运行任务(我不想),而是为了利用完成的工作来提供返回值、捕获异常和取消正在运行的任务。但是,当我在一些测试代码上运行它时,我发现调用 Future.cancel(true) 似乎并没有取消任务。

我在 StackOverflow 上看到了几个关于为什么会发生这种情况的问题 ( such as this one ),答案总是一样的:cancel(true) 通过在运行 Callable 的线程上调用 interrupt() 来工作,这需要在取消生效之前,被取消的任务 block 在 interrupt()ible 操作(例如 Thread.sleep())上。由于我无法控制正在执行的代码,因此无法保证它会执行此操作,因此我无法确定我是否已取消它。

有什么方法可以让我运行动态加载的代码,然后在执行过程中终止它并确保它终止,即使它从不阻塞 interrupt()ible 操作?

// Assume: ExecutorService pool, Callable<T> task,
// long timeout, TimeUnit timeUnit
Future<T> future = pool.submit(task);
T result;

try {
result = future.get(timeout, timeUnit);
// do something with result
} catch (TimeoutException ex) {
future.cancel(true);
// handle timeout
} catch (ExecutionException ex) {
// handle exeception thrown by task
} catch (InterruptedException ex) {
// handle InterruptedException
}

最佳答案

取消,或者更确切地说线程中断,机制从根本上讲是协作的,您无法中断恶意任务。您唯一的选择是 Thread.stop() 它们,但出于多种原因非常危险。

关于java - 取消我没有写的动态加载的 Callable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11638306/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com