当前位置: 首页 > 面试题库 >

Java中的流程生成器和流程-如何执行超时的流程?

宰父跃
2023-03-14
问题内容

我需要在Java中执行具有特定超时的外部批处理文件。这意味着,如果批处理执行的时间比指定的超时时间长,我需要取消执行。

这是我编写的示例代码:

public static void main(String[] args) throws IOException, InterruptedException {
    ProcessBuilder p = new ProcessBuilder("c:\\wait.bat", "25");  // batch file execution will take 25 seconds.
    final long l = System.currentTimeMillis();
    System.out.println("starting..." + (System.currentTimeMillis() - l));
    final Process command = p.start();
    System.out.println("started..." + (System.currentTimeMillis() - l));

    Timer t = new Timer();
    t.schedule(new TimerTask() {

        @Override
        public void run() {
            command.destroy();
        }
    }, 5000);   // it will kill the process after 5 seconds (if it's not finished yet).
    int i = command.waitFor();
    t.cancel();
    System.out.println("done..." + (System.currentTimeMillis() - l));
    System.out.println("result : " + i);

    System.out.println("Really Done..." + (System.currentTimeMillis() - l));
}

批处理文件“ wait.bat”是这样的:

@echo off
echo starting the process...
@ping 127.0.0.1 -n 2 -w 1000 > nul
@ping 127.0.0.1 -n %1% -w 1000> nul
echo process finished succesfully
@echo on

如您在代码中看到的,批处理文件将花费25秒完成(main方法的第一行),并且Timer将在5秒后销毁命令。

这是我的代码的输出:

starting...0
started...0
done...5000
result : 1
Really Done...5000
BUILD SUCCESSFUL (total time: 25 seconds)

如您在输出中看到的,最后一行(“ Really Done …”)在第5秒执行,但应用程序在25秒后完成。

我的问题是:即使我在计时器中调用了destroy方法,为什么jvm仍在等待进程完成?


问题答案:

这是Java
在Windows上的实现中的错误Process.destroy()。问题在于,批处理脚本(或其执行的shell)被杀死,但不杀死其自己的子进程(此处为ping)。因此,ping仍然在.destroy()和之后运行.waitFor()。但是,不知何故,VM仍在完成ping操作之前等待ping操作完成。

在Java方面,您似乎无能为力地真正杀死ping。

您可能会考虑使用start(在批处理脚本中或外部)调用ping作为一个单独的过程。

(另请参见前面的讨论。)

或更改为类似Unix的操作系统。



 类似资料:
  • 问题内容: 我正在尝试编写一个从命令提示符下编译另一个Java文件的程序。我对此有疑问。至此,它已成功执行了第一部分,该部分将编译Mocha.java。但是,我希望它也执行该文件并显示其输出。它什么也不显示。有什么建议? 注意: 我还尝试将所有参数初始化为: 但是,这不仅没有用,而且甚至没有像上面那样编译Mocha.java。 谢谢! 编辑: 因此,我将其更改为两个过程。现在工作棒!对于任何有兴趣

  • ipush 放到操作数栈 istore 到本地变量表 div 除 getstatic #2->常量池中的#2 找到函数 符号引用转为直接引用 接下来是invokevirtual 最后肯定有一个return 这个实例还没有涉及到堆空间,如果涉及到堆空间的话很复杂,涉及引用变量

  • 问题内容: 我需要帮助,以了解如何在Go中妖魔化一个流程。 如果在命令行上启动此代码,则程序将返回控制权,但仍与cmd连接。关闭cmd将关闭程序。 如何将其与cmd分离?新增: 导致此错误:错误内存指针“恐慌” 问题答案: 我在“ golang-nuts”中询问,发现golang具有链接选项:

  • 本文向大家介绍java验证码生成的基本流程,包括了java验证码生成的基本流程的使用技巧和注意事项,需要的朋友参考一下 1.验证码的生成,我们能够看到是用Graphics对象画出来的。对象我们必须要获得Graphics对象 1-1、Graphics对象的获取,要通过BufferedImage获得 1-2、一般的验证码背景框都是白色的 1-3、保存数据(后台验证使用)和设置字体样式(美观) 1-4、

  • 我正在研究一些Java8流特性。我对FP相当熟悉,三十年前写过一些Lisp,我想我可能会尝试做一些新工具不真正针对的事情。不管怎样,如果这个问题很愚蠢,我很高兴知道我的错误。 我将给出一个具体的问题,尽管它实际上是我试图解决的一般概念。 假设我想从流的每三个元素中获取一个流。在常规FP中,我将(近似地)创建一个递归函数,该函数通过在删除两个元素之后将列表的第一个元素与列表的其余元素(调用thyse

  • 一、背景 最近总在弄MR的东西,所以写点关于这个方面的内容,总结一下吧 二、流程描述 说实话,文字描述比较苍白,画了个图,贴出来,大家看看,有问题欢迎指出 三、总结 1、值得提出的是,一个map结束就马上会进行分区的操作。并非是等所有的map都结束才做分区的操作。 2、分组的操作是对key的值进行比较分组。(可以是复合key,也可以是单一的key) 3、关于job.setSortComparato