java超时结束程序_java本机进程超时

java本机进程超时

目前,我使用以下命令执行本机进程:

java.lang.Process process = Runtime.getRuntime().exec(command);

int returnCode = process.waitFor();

假设我希望在经过一定时间后终止,而不是等待程序返回。 我该怎么做呢?

deltanovember asked 2020-07-22T02:28:34Z

6个解决方案

51 votes

所有其他响应都是正确的,但是可以使用FutureTask使它更健壮和有效。

例如,

private static final ExecutorService THREAD_POOL

= Executors.newCachedThreadPool();

private static T timedCall(Callable c, long timeout, TimeUnit timeUnit)

throws InterruptedException, ExecutionException, TimeoutException

{

FutureTask task = new FutureTask(c);

THREAD_POOL.execute(task);

return task.get(timeout, timeUnit);

}

try {

int returnCode = timedCall(new Callable() {

public Integer call() throws Exception {

java.lang.Process process = Runtime.getRuntime().exec(command);

return process.waitFor();

}

}, timeout, TimeUnit.SECONDS);

} catch (TimeoutException e) {

// Handle timeout here

}

如果重复执行此操作,则线程池会更高效,因为它会缓存线程。

ZZ Coder answered 2020-07-22T02:30:06Z

21 votes

如果您使用的是Java 8,则可以将新的waitFor与超时一起使用:

Process p = ...

if(!p.waitFor(1, TimeUnit.MINUTE)) {

//timeout - kill the process.

p.destroy(); // consider using destroyForcibly instead

}

Aleksander Blomskøld answered 2020-07-22T02:30:26Z

19 votes

这是Plexus CommandlineUtils的工作方式:

Process p;

p = cl.execute();

...

if ( timeoutInSeconds <= 0 )

{

returnValue = p.waitFor();

}

else

{

long now = System.currentTimeMillis();

long timeoutInMillis = 1000L * timeoutInSeconds;

long finish = now + timeoutInMillis;

while ( isAlive( p ) && ( System.currentTimeMillis() < finish ) )

{

Thread.sleep( 10 );

}

if ( isAlive( p ) )

{

throw new InterruptedException( "Process timeout out after " + timeoutInSeconds + " seconds" );

}

returnValue = p.exitValue();

}

public static boolean isAlive( Process p ) {

try

{

p.exitValue();

return false;

} catch (IllegalThreadStateException e) {

return true;

}

}

Rich Seller answered 2020-07-22T02:29:37Z

6 votes

那Groovy的方式呢

public void yourMethod() {

...

Process process = new ProcessBuilder(...).start();

//wait 5 secs or kill the process

waitForOrKill(process, TimeUnit.SECONDS.toMillis(5));

...

}

public static void waitForOrKill(Process self, long numberOfMillis) {

ProcessRunner runnable = new ProcessRunner(self);

Thread thread = new Thread(runnable);

thread.start();

runnable.waitForOrKill(numberOfMillis);

}

protected static class ProcessRunner implements Runnable {

Process process;

private boolean finished;

public ProcessRunner(Process process) {

this.process = process;

}

public void run() {

try {

process.waitFor();

} catch (InterruptedException e) {

// Ignore

}

synchronized (this) {

notifyAll();

finished = true;

}

}

public synchronized void waitForOrKill(long millis) {

if (!finished) {

try {

wait(millis);

} catch (InterruptedException e) {

// Ignore

}

if (!finished) {

process.destroy();

}

}

}

}

mickthompson answered 2020-07-22T02:30:46Z

4 votes

只是根据我的要求做了一些修改。 这里的超时时间是10秒。 如果该进程没有退出,则会在10秒后被销毁。

public static void main(String arg[]) {

try {

Process p = Runtime.getRuntime().exec("\"C:/Program Files/VanDyke Software/SecureCRT/SecureCRT.exe\"");

long now = System.currentTimeMillis();

long timeoutInMillis = 1000L * 10;

long finish = now + timeoutInMillis;

while ( isAlive( p ) ) {

Thread.sleep( 10 );

if ( System.currentTimeMillis() > finish ) {

p.destroy();

}

}

} catch (Exception err) {

err.printStackTrace();

}

}

public static boolean isAlive( Process p ) {

try {

p.exitValue();

return false;

} catch (IllegalThreadStateException e) {

return true;

}

}

nuwan answered 2020-07-22T02:31:06Z

2 votes

您需要一个2.线程来中断调用.waitFor()的线程。为了使其健壮,将需要一些非同寻常的同步,但基础知识是:

TimeoutThread:

Thread.sleep(timeout);

processThread.interrupt();

ProcessThread:

try {

proc.waitFor();

} catch (InterruptedException e) {

proc.destroy();

}

nos answered 2020-07-22T02:31:35Z

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/519326.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle 修改表字段的长度

alter table 表名 modify 列名 数据类型&#xff1b; alter table bl_yhsz modify zcmc varchar2(120); alter table sys_job_log modify EXCEPTION_INFO VARCHAR2(3000);

对话Ruby创始人松本行弘、阿里高级技术专家朴灵!

4月25日&#xff0c;云栖社区联合阿里云国际站&#xff0c;特别邀请了Ruby创始人Matz&#xff08;松本行弘&#xff09;、阿里云高级技术专家朴灵&#xff0c;来为开发者们分享干货。 在本次活动上可以了解到Ruby语言最新的动态&#xff0c;Ruby和新语言golang在性能方面的差别…

Serverless 终结 Kubernetes?

戳蓝字“CSDN云计算”关注我们哦&#xff01;Kubernetes 是基础架构管理的终极解决方案吗&#xff1f;还是说我们更加需要 Serverless&#xff1f;究竟哪种技术能够解救运维团队&#xff1f;不要忘记&#xff0c;NoOps 的世界即将到来。作者 | Daniele Fontani译者 | 弯月封图 …

代号“凤凰”,阿里新零售秘密武器,今年要打入100个城市

2019年&#xff0c;淘鲜达要在100个城市完成1000个门店的新零售改造。 天下网商记者 张文政 过去一年&#xff0c;初平三分之二的时间在出差&#xff0c;足迹遍及山东、河南、江西、湖南等地。 初平是天猫超市事业群战略合作部总经理&#xff0c;负责天猫超市旗下“淘鲜达”…

VS Code 批量操作

文章目录1. 关键词批量选中2. 末尾批量编辑3. 垂直批量编辑4. 垂直批量选中5. 批量选中整行6. 批量复制整行1. 关键词批量选中 Ctrld 选中相同的词句&#xff0c;批量编辑 2. 末尾批量编辑 shirtalti移动到最后&#xff0c;批量编辑 3. 垂直批量编辑 Ctrlalt↓垂直批量编…

Node.js 应用故障排查手册 —— 利用 CPU 分析调优吞吐量

楔子 在我们想要新上线一个 Node.js 应用之前&#xff0c;尤其是技术栈切换的第一个 Node.js 应用&#xff0c;由于担心其在线上的吞吐量表现&#xff0c;肯定会想要进行性能压测&#xff0c;以便对其在当前的集群规模下能抗住多少流量有一个预估。本案例实际上正是在这样的一…

python idea控制台中文乱码_解决IntelliJ IDEA 控制台输出中文乱码问题(史上最简单)...

解决IntelliJ IDEA 控制台输出中文乱码问题(史上最简单)首先&#xff0c;找到 IntelliJ IDEA 的安装目录&#xff0c;进入bin目录下&#xff0c;定位到idea.vmoptions文件&#xff0c;如下图所示&#xff1a;双击打开idea.vmoptions文件&#xff0c;如下图所示&#xff1a;然后…

VS Code 下载

官网地址&#xff1a; https://code.visualstudio.com/

通过DataWorks数据集成归档日志服务数据至MaxCompute进行离线分析

但是会遇到大家在分区上或者DataWorks调度参数配置问题&#xff0c;具体拿到真实的case模拟如下&#xff1a; 创建数据源&#xff1a; 步骤1 进入数据集成&#xff0c;点击作业数据源&#xff0c;进入Tab页面。 步骤2 点击右上角 新增数据源&#xff0c;选择消息队列…

这是我见过最卡通的 Python 算法了,通俗易懂

戳蓝字“CSDN云计算”关注我们哦&#xff01;普通程序员&#xff0c;不学算法&#xff0c;也可以成为大神吗&#xff1f;对不起&#xff0c;这个&#xff0c;绝对不可以。可是算法好难啊~~看两页书就想睡觉……所以就不学了吗&#xff1f;就一直当普通程序员吗&#xff1f;如果…

在 IntelliJ IDEA 中部署应用到服务器

在之前的文章《在 Intellij IDEA 中部署 Java 应用到 阿里云 ECS》中讲解了如何将一个本地应用部署到阿里云 ECS 上去&#xff0c;有些读者反馈目前还有一些测试机器是在经典网络&#xff0c;甚至是在本地机房中&#xff0c;咨询是否可以通过 Cloud Toolkit 插件将应用部署到这…

java递归老鼠走迷宫_递归算法求老鼠走迷宫(C语言)

/*说明老鼠走迷宫是递回求解的基本题型&#xff0c;我们在二维阵列中使用2表示迷宫墙壁&#xff0c;使用1来表示老鼠的行走路径&#xff0c;试以程式求出由入口至出口的路径。解法老鼠的走法有上、左、下、右四个方向&#xff0c;在每前进一格之后就选一个方向前进&#xff0c;…

玩转 VS Code 专栏

文章目录一、企业基础篇1. 软件下载2. 中文界面3. 大佬快捷键4. 批量操作5. 大佬开发插件6. 主题配置7. 企业收费字体8. 切换大小写9. Vue代码片段10. VS Code Git 日常操作二、进阶篇一、企业基础篇 1. 软件下载 https://gblfy.blog.csdn.net/article/details/109453896 2.…

对话行癫:解密阿里云顶层设计和底层逻辑

几十个问题&#xff0c;万字长文&#xff0c;阿里云新任总裁行癫履新后首次出面与钛媒体独家深入讨论了一下阿里云对云计算未来的判断&#xff0c;深度解读未来阿里云生态战略&#xff0c;揭秘阿里技术委员会和阿里中台思想的原生思考。 阿里云智能总裁张建锋 钛媒体注&#x…

Python获取2019-nCoV疫情实时追踪数据

戳蓝字“CSDN云计算”关注我们哦&#xff01;来源 | 三行科创责编 | Carol出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09; 2019-nCoV新型冠状病毒引发的肺炎牵动全国人民的心&#xff0c;无数无畏的英雄儿女逆行而上奔赴前线&#xff0c;作者也于2020年2月…

idea菜单栏消失如何调整回来

有一天, 把idea中 view下面的Appearance里面的Main Menu 给反选了 导致idea顶部的菜单栏给消失了, 就像下图这样 可以双击shift键&#xff0c;输入view&#xff0c;选择action里面的View 选择Appearance里面的Main Menu 即可把菜单栏调回来.

这款神秘的移动端OCR引擎,如何做到“所见即所得”?

阿里妹导读&#xff1a;随着深度学习&#xff0c;尤其是CNN和RNN等技术的飞速发展&#xff0c;文字识别技术(OCR)近几年得到了迅速的提升。与此同时&#xff0c;在智能化终端的大趋势下&#xff0c;本地化智能识别凭借更高效快捷的体验以及高度的隐私保护和零流量消耗等优势备受…

python中的newline_python open函数newline用法

写这些文章主要是督促自己学习&#xff0c;过去两年时间&#xff0c;断断续续在学习linux、python以及机器学习方面的知识&#xff0c;东西看了很多&#xff0c;却没有实际动手操作&#xff0c;很多不明白的知识当时解决后没有记录&#xff0c;现在也忘得差不多了。为此&#x…

想要AI优先?数据优先才行

戳蓝字“CSDN云计算”关注我们哦&#xff01;来源 | forbes编译 | shawn责编 | Carol出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09; 开展人工智能和机器学习项目的人很早就知道&#xff0c;机器学习项目不是应用程序开发项目。机器学习项目的大部分价值在…

Cloud Toolkit 部署应用到阿里云轻量应用服务器

在之前的文章《在 Intellij IDEA 中部署 Java 应用到 阿里云 ECS》中讲解了如何将一个本地应用部署到阿里云 ECS 上去&#xff0c;有些读者反馈目前正在使用阿里云轻量应用服务器&#xff0c;咨询是否可以通过 Cloud Toolkit 插件将应用部署到这些服务器上去&#xff1f;最新版…