如何检测未知线程池并将其关闭?

时间:2017-03-15 08:29:02

标签: java multithreading

我需要为一个代码块设置超时,该代码块将调用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();
    }

不知道为什么前代码失败......如果有人知道,我们仍然可以讨论。

感谢所有善意的回复。真的很感激。

2 个答案:

答案 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()