当前位置: 首页 > 知识库问答 >
问题:

使用executorservice控制运行时进程

任昊苍
2023-03-14

我使用一个Runnable对象来运行processCommand并执行一些需要一定时间的处理(我们称之为insideprocess)。在insideprocess的末尾,它将向文本文件写入一些内容。其思想是,如果在指定的时间内insideprocess仍未完成,则必须将其杀死,因此我使用ExecutorService来处理它。但是如果insideprocess早于指定时间完成,它将中断ExecutorService以便主线程可以继续执行下一个任务。

但问题是,有时insideprocess根本没有创建文件,或者它创建了一个文件,但文件中没有写入任何内容。当insideprocess早于指定时间完成时,就会发生这种情况。我不知道我的实现出了什么问题。请注意,如果我手动执行流程(不使用ExecutorService),流程运行良好,并且它正确地编写了所有内容。

在这里,我发布了我的html" target="_blank">代码来完成这项工作:

public void process(){


    for (int i = 0; i < stoppingTime.length; i++) {
        for (int j = 2 * i; j < 2 * (i + 1); j++) {
            final int temp = j;
            ExecutorService executor = Executors.newSingleThreadExecutor();

            Runnable r = new Runnable() {

                @Override
                public void run() {
                    Process p = null;

                    int ex = 1;

                    try {
                        p = Runtime.getRuntime().exec(
                                processCommand.get(temp));

                        while (ex != 0) {
                            try {
                                //sleep every 30 second then check the exitValue
                                Thread.sleep(30000);
                            } catch (InterruptedException e) {

                            }
                            ex = p.exitValue();
                            p.destroy();                                
                        }                           
                    } catch (IOException e) {
                        e.printStackTrace();
                        System.out.println("IOException");
                    }
                }

            };

            Future future = executor.submit(r);

            try {
                System.out.println("Started..");
                future.get(stoppingTime[i], TimeUnit.SECONDS);                  
                System.out.println("Finished!");
            } catch (TimeoutException e) {
                System.out.println("Terminated!");
            } catch (InterruptedException e) {
                System.out.println("Future gets InterruptedException");
            } catch (ExecutionException e) {
                System.out.println("Future gets ExecutionException");
            }
            executor.shutdownNow();
            System.out.println("shutdown executor");
        }
        System.out.println();
    }

}

共有1个答案

辛锦
2023-03-14

老问题,我想我还是要试试。

首先,您将在双循环中获得一个executorservice,它与定义的runnable位于同一块中。如果您希望获得本机执行“processCommand”的返回值,然后继续执行下一个任务,那么您需要在循环之前实例化ExecutorService来重用该ExecutorService。

其次,stoppingtime[i]int,而future.get(...)需要long

 类似资料:
  • 主要内容:1. 主进程和工作进程,2. 控制NGINX本节介绍NGINX在运行时启动的过程以及如何控制它们。 在这个部分中,主要涉及两个部分的内容: 主进程和工作进程 控制NGINX 1. 主进程和工作进程 NGINX有一个主进程和一个或多个工作进程。 如果启用缓存,缓存加载程序和缓存管理器进程也将在启动时运行。 主程序的主要目的是读取和评估配置文件以及维护工作进程。 工作进程执行请求的实际处理。 NGINX依赖于操作系统的机制来有效地在工作进程之间

  • 针对 Subversion 1.4(根据r2866编译) 前言 序言 读者 怎样阅读本书 本书约定 排版习惯 图标 本书的结构 本书是免费的 致谢 来自 Ben Collins-Sussman 来自 Brian W. Fitzpatrick 来自 C. Michael Pilato Subversion是什么? Subversion的历史 Subversion的特性 Subversion的架构 S

  • 我还有一个关于Python多处理的问题。我有一个模块,它创建了一个进程,并在while-True循环中运行。此模块将从另一个Python模块启用/禁用。另一个模块将导入第一个模块一次,并作为进程运行。 我该如何更好地实现这一点? 因此,作为参考: 想象第二个模块是这样的: 不断地运行一个流程来检查循环中的条件似乎是一种浪费,但我很乐意接受这样的解决方案,它只允许我从外部设置值。理想情况下,我希望能

  • 我已经用RxJava成功地完成了一个小型Java程序。代码为: 使用此代码,一切正常。现在我正在尝试将此代码传递给Android: 在finished()方法中,我正在更新GUI(finishedListener是当前活动正在实现的接口)。 我在使用map(I)的线路上遇到错误- 内置。gradle(用于应用程序)我正在使用: 我如何解决这个问题?

  • 运行控制用来对实验状态与实验流量进行调整与控制。本节将会对运行控制的使用流程进行详细介绍。主要内容包括实验定向的使用与使用流量的调节。 已经关闭的实验不允许重新启用,此时如果你想再次尝试一下,你可以选择重新创建一个实验,并且沿用原来变量与变量值,实验内容依然生效。已经结束的实验请及时关闭 1.1. 实验流量分配 Figure: 运行控制 控制实验状态,包括实验的开启与关闭。为了保证实验的科学性,已

  • 之前我们学习了利用 pin 设备控制 led 的亮灭,这一节我们学习利用 pin 设备进行按键的控制。 基础知识 按键控制的实现有很多的方式,在裸机编程的时候最常用的就是延时消抖以及抬手检测了,可以很简单的就实现按键的输入。其实还有更加简单、灵活的按键处理方式,就是每隔一定的时间间隔扫描一次按键的状态,如果连续多次按键的状态都是按下的状态,我们就认为按键是按下的。 在裸机编程的时候,按键处理一般是