我需要为一个代码块设置超时,该代码块将调用jar文件中的方法。 我使用以下代码
final Runnable stuffToDo = new Runnable() {
@Override
public void run() {
/* Do stuff here. */
jarclass.run();
}
};
final ExecutorService executor = Executors.newFixedThreadPool(1);
final Future future = executor.submit(stuffToDo);
//executor.shutdown(); // This does not cancel the already-scheduled task.
try {
future.get(1, TimeUnit.SECONDS);
}
catch (InterruptedException ie) {
/* Handle the interruption. Or ignore it. */
}
catch (ExecutionException ee) {
/* Handle the error. Or ignore it. */
}
catch (TimeoutException te) {
/* Handle the timeout. Or ignore it. */
}
if (!executor.isTerminated()){
executor.shutdownNow();
}
然而,jarclass.run()以某种方式启动另一个继续运行的线程,并使用pool-2-thread-1显示所有打印输出。
如何完全关闭jarclass.run()??
更新: 我将新的Thread()更改为新的Runnable。它仍然无法正常工作。 令我困惑的是,我不知道jarclass在哪里启动另一个线程并且无法处理它。当代码转到executor.shutdownNow()时,它会跳出并运行以下代码。但是jarclass.run()仍在运行。 我不是很擅长英语。希望我明白这一点。
更新
此代码解决了问题:
Future<String> future = new FutureTask<String>(new Callable<String>() {
public String call() throws Exception {
jarclass.run();
return null;
}
});
try {
future.get(1, TimeUnit.SECONDS);
} catch (Exception e) {
e.printStackTrace();
}
不知道为什么前代码失败......如果有人知道,我们仍然可以讨论。
感谢所有善意的回复。真的很感激。
答案 0 :(得分:0)
使用Thread
时,您不应该ExecutorService
实例化。请改用Runnable
:
final Runnable stuffToDo = new Runnable() { /* as it is now */ };
直接创建线程时,它不是由您稍后创建的执行器服务管理的,这就是所有日志的原因。
答案 1 :(得分:0)
直接杀死线程并不安全,请参阅Thread.stop() deprecated
建议使用可以通知线程的标志,这是一个停止的时间。
如果您可以访问jar并修改代码,则可以使用标记在public function create()
{
$pilots = Pilot::all();
return view('uwagi.create',$pilots);
}
中创建名为stop()
的方法,这样当您需要终止进程时,可以调用jarclass
。
例如:
jarclass.stop()