Java 8:在一定时间后终止/停止线程

3
我有一个基于Java 8的项目,它可以在给定的URL上执行某个特定功能。我需要修改下面的代码片段,以便它能够在当前进程状态无关的情况下,在一定时间后杀死正在运行的线程/进程并运行下一个实例。
我尝试了以下技术来实现线程终止程序:
  • Executor服务
  • 计时器任务
  • 多线程线程终止
我的最新尝试的代码片段链接如下。
@SuppressWarnings("static-access")
public static void main(String[] args) {
//fetch url from the txt file
    List<String> careerUrls = getCareerUrls();
    int a = 0;
    DBConnection ds = null;
    ds = DBConnection.getInstance();
    try (java.sql.Connection con = ds.getConnection()) {
        //read a single Url
        for (String url : careerUrls) {
            int c = a++;

            ExecutorService executor = Executors.newFixedThreadPool(3);

            Future<?> future = executor.submit(new Runnable() {
                @Override
                // <-- job processing
                public void run() {
                    long end_time = System.currentTimeMillis() + 10000;

                    System.out.println("STARTED PROCESSING URL: " + url);
                    jobareaDeciderSample w = new jobareaDeciderSample();
                    w.mainSample(url, c, con);

                }
            });
            // <-- reject all further submissions
            executor.shutdown();
            try {
                future.get(120, TimeUnit.SECONDS); // <-- wait 2 Minutes to finish
            } catch (InterruptedException e) { // <-- possible error cases
                System.out.println("job was interrupted");
                future.cancel(true);
                Thread.currentThread().interrupt();
                ;
            } catch (ExecutionException e) {
                System.out.println("caught exception: " + e.getCause());
            } catch (TimeoutException e) {
                System.out.println("timeout");
                future.cancel(true);

            }

            // wait all unfinished tasks for 2 sec
            if (!executor.awaitTermination(0, TimeUnit.SECONDS)) {
                // force them to quit by interrupting
                executor.shutdownNow();
            }
        }

    } catch (Exception e) {
        LOGGER.error(e);
    }

}
1个回答

1

你的方法是正确的。在future上调用cancel(true);是停止这个任务的正确方式。

你还有另一个问题-你不能仅仅停止一个线程。(嗯,你可以使用thread类中的stop(),但你永远不应该这样做)。

cancel(true);向线程发送信息,告诉它应该停止。一些java类会对此信息作出响应并抛出中断异常。但有些不会。你必须修改你的任务代码,检查是否Thread.currentThread().isInterrupted(),如果是,停止执行。

这是你需要在你的代码中完成的事情,你通过它来调用。

  jobareaDeciderSample w = new jobareaDeciderSample();
                    w.mainSample(url, c, con);

如果你说你要处理URL,那么你应该在长时间的循环代码中进行,在这个循环中下载网页信息。换句话说,只有当你的代码花费99%的时间时才进行此检查。
此外,你正在调用。
        Thread.currentThread().interrupt();

在您的主线程中,这对您没有任何帮助,因为如果您想要退出当前线程,只需调用return即可。

如果您要对自己的线程中断做出反应,应使用Thread.interrupted()进行测试。这也会清除状态。当您不处理它时(也许您甚至从不同的线程调用它),方法someThreadInstance.isInterrupted()用于监视状态,因此状态不会受到影响。 - Holger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接