2011-12-12 99 views
0

我有一个图书馆电话,比方说Descriptor.compute(Molecule m)Java中实际停止()线程的线程池?

对于某些分子(库中的一个bug)以及对于某些分子来说,这个调用会永远挂起,它会长时间进行计算。我想在服务器上运行计算,最好采用多线程或多处理的方式,以便可以使用所有处理器。此外,我不希望计算机花费比TIMEOUT更多的时间用于任何分子。

由于compute方法不会对isInterrupted()进行任何检查,也不会在任何地方等待,因此它不会响应Thread.interrupt()调用。

所以我认为我需要使用Thread.stop(),它在阻止这种类型的任务中工作正常。

我的问题是:是否有一些线程池能够实际停止线程?

我做了一个简单的池,它使用ArrayBlockingQueue<Input>ArrayBlockingQueue<Result>进行通信。然而,我在compute()期间奇怪NullPointerException,我无法跟踪(这些异常也有空堆栈跟踪)。所以我问是否已经有一些现有的实施,我的谷歌搜索没有带来任何收获,我发现的所有东西只有interrupt s。

谢谢你的时间。

编辑:顺便说一下,图书馆是CDK

+0

嗯..如果你设置M为空另一个线程,是否强制'计算'方法抛出异常?如果不是,“分子”中是否有其他字段经常被“计算”处理并强制进行段错误/ AV? –

+0

每个描述符实现的行为不同。不幸的是,没有一个安全的地方可以抛出异常。 – Krab

+0

“图书馆中的一个错误”:虽然这可能不是近期的解决方案,但为了公众利益,您应该向他们提交错误报告(或者如果已经存在,请对其进行投票)。 – Thilo

回答

2

在Java中没有一种好方法来“杀死”一个线程。阅读long disclaimer on the deprecated Thread#stop method。因此,没有现代的API(例如JDK中的ExecutorServices)会使用这种方法。

你必须让那些线程检查中断和终止标志。

+0

是的,我知道这一点。不幸的是,这对我来说不是一种选择,因为Descriptor接口是由很多类实现的。 – Krab

+0

在这种情况下,可能会产生一个新的JVM进程来执行这些计算。你可以杀死进程。 – Thilo

+0

我已经想过了。你知道像Python的'multiprocessing'那么简单吗?或者通常在Java中用于高级IPC的工具是什么? – Krab