- 浏览: 676832 次
- 性别:
- 来自: 安徽
文章分类
- 全部博客 (252)
- Html/Div+CSS (12)
- Js/Jquery (34)
- Flex (2)
- Ajax (3)
- Java (35)
- C# (15)
- Spring (16)
- Hibernate (13)
- Struts2 (12)
- Struts1 (7)
- DWR (1)
- iBatis/myBatis (9)
- Tag(JSTL、EL) (1)
- Android (44)
- SQL (7)
- SEO (7)
- Exception (3)
- Tool (10)
- Other (3)
- WebService (9)
- Apache (7)
- Ext (0)
- Utils (12)
- thinking in programme (2)
- Hadoop (0)
- ActiveMQ (0)
- HTML5/CSS3 (0)
- WPF (1)
- NodeJs (1)
- 设计模式 (0)
- 程序人生 (1)
- 随笔 (1)
- Linux (1)
- Load Balance (0)
最新评论
-
drinkjava2:
太复杂了而且不通用,利用ThreadLocal可完美解决这一问 ...
JDBC的多条件动态查询 -
u013107014:
multipartRequest.getFiles(" ...
多文件上传 by MultipartFile and Multiple -
liyys:
可惜没讲你mysql数据库的表的设计
iBatis入门 -
Mapple_leave:
效果还是挺不错的,谢谢了。
中文简体与繁体的转换 -
arcpad:
JS禁用浏览器退格键
在做视频转换时,调用外部的 exe 去进行一些视频转换的操作时,因为考虑到速度问题,当时是通过启动多个线程来共同完成某个操作的,因为是多线程操作,所以当时我控制的主线程等待所有子线程执行完后再继续向下去执行。但是始终出现发现没有控制住子线程未执行完主线程就向下继续执行的情况,开始因为是启动多线程时线程控制问题,后来发现是子线程中利用 Process 调用外部 exe 时出现了 waitFor() 方法阻塞问题(唉,折腾啊)。 Ok ,知道问题就好解决了。
首先来解释一下 waitFor() 方法的意义, waitFor() 表示当前 Process 所在的子线程处于等待状态,如有必要,一直要等到由该 Process 对象表示的进程已经终止,网上说如果我们在调用此方法时,如果不注意的话,很容易出现主线程阻塞, Process 也挂起的情况。这就是我遇到的问题,网上的解决办法是,在调用 waitFor() 的时候, Process 需要向主线程汇报运行状况,所以要注意清空缓存区,即 InputStream 和 ErrorStream ,注意这里 InputStream 和 ErrorStream 都需要清空。
package com.iflytek.util; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; /** * * @author xdwang * * @ceate 2012-7-20 下午22:52:25 * * @email xdwangiflytek@gmail.com * * @description 清除process里的InputStream和ErrorStream 缓存 * */ public class ProcessClearStream extends Thread { private InputStream inputStream; private String type; ProcessClearStream(InputStream inputStream, String type) { this.inputStream = inputStream; this.type = type; } public void run() { try { InputStreamReader inputStreamReader = new InputStreamReader( inputStream); BufferedReader br = new BufferedReader(inputStreamReader); // 打印信息 String line = null; while ((line = br.readLine()) != null) { System.out.println(type + ">" + line); } // 不打印信息 // while (br.readLine() != null); } catch (IOException ioe) { ioe.printStackTrace(); } } }
此时,我们再看看 Process 调用 exe 的方法:
package com.iflytek.util; /** * @author xdwang * * @ceate 2012-7-20 下午22:22:44 * * @email xdwangiflytek@gmail.com * * @description process工具类 * */ public class ProcessUtil { /** * @descrption 执行外部exe公用方法 * @author xdwang * @create 2012-7-20下午22:24:32 * @param cmdStr * 命令字符串 */ public static void execProcess(String cmdStr) { Process process = null; try { System.out.println(cmdStr); process = Runtime.getRuntime().exec(cmdStr); new ProcessClearStream(process.getInputStream(), "INFO").start(); new ProcessClearStream(process.getErrorStream(), "ERROR").start(); int status = process.waitFor(); System.out.println("Process exitValue: " + status); } catch (Exception e) { System.out.println("执行" + cmdStr + "出现错误," + e.toString()); } finally { if (process == null) { process.destroy(); } process = null; } } }
发表评论
-
log4j xml配置详解
2014-06-18 10:37 1140<?xml version="1.0&qu ... -
test
2013-07-29 09:16 0private static CacheImpl insta ... -
多文件上传 by MultipartFile and Multiple
2012-12-03 09:13 14352最近的一个项目中,需要用到 ... -
布局框架-SiteMesh
2012-11-30 08:57 2594最近在一个项目中使用 ... -
Servlet
2012-12-07 08:36 1549一、认识 Servlet : ... -
连接池
2012-12-10 08:42 1448... -
忆Java String
2012-11-15 08:38 1269平时 .NET 写多了, Java ... -
Eclipse中右键快速定位文件资源的工具
2012-11-09 08:43 2013当你开发.NET项目后,使用VS习惯了再来使用Java和Ecl ... -
Java中MessageFormat对象实现格式化字符串输出,类似C#中的string.format方法
2012-09-29 11:39 3671平时.NET做多了,再做Java时,总会进行一些比较,比如说J ... -
byte[]与InputStream互转
2012-09-29 11:39 1584InputStream转byte[] private ... -
统一中英文长度问题
2012-07-20 00:17 1938最近因为在做一个项目要求很多都是英文,所以这就涉及到在页 ... -
Tomcat注册成系统服务
2012-07-17 00:00 1564为了部署项目后不出现黑色的 doc 命令框,所以很 ... -
urlrewrite实现伪静态化
2012-07-25 00:41 3218产生背景 静态网页与动态网页比较: ... -
Java中java.util.Date时间和java.sql.Date时间的相互转化
2012-01-30 22:49 2963刚刚写用 JS 禁用退格键时( http ... -
使用BeanUtils类简化request和resultset转换
2012-01-21 20:23 2971当提交表单时,如果没有使用Struts等框架的话,你的代 ... -
JDBC的多条件动态查询
2012-01-19 11:05 7197前面我已经提到了现在的项目无非就是列表里的分页加多条件查 ... -
JDBC分页
2012-01-19 10:15 5527不知道大家做项目做到最后有什么感觉没有,其实大家做来做去 ... -
Java农历(阴历)工具类
2012-01-20 11:30 2361在真实的项目开发中会可能会遇到项目需要对阴历即我们所说的农历节 ... -
Eclipse中java项目引用dll库的路径设置(System.loadLibrary()调用Dll路径问题)
2012-01-16 14:13 4273右击项目名|选择属性properties|在左边列表内选择“J ... -
联系人导出(msn、邮箱)
2012-01-16 11:48 8351在项目开发中,不知道大家有没有涉及到导出邮箱或msn的联系人( ...
相关推荐
`Process`对象的`waitFor()`方法会阻塞直到进程结束,返回值是进程的退出码: ```java int exitCode = process.waitFor(); System.out.println("Process exited with code: " + exitCode); ``` ### 6. 销毁进程 ...
process.waitFor(); ``` 5. **删除文件** - 使用`Runtime.getRuntime().exec()`删除文件时,必须包含命令解释器,例如: ```java Process process = Runtime.getRuntime().exec("cmd /c del f:\\aaa.doc"); `...
需要注意的是,如果命令的执行时间过长,`waitFor()`方法也会阻塞较长时间,因此在实际应用中要考虑到这一点。 ### 总结 通过Java的`Runtime`类,我们可以轻松地执行外部的可执行文件和批处理文件。这种方式不仅...
为避免此问题,你需要在`waitfor()`之前读取并处理`Process`的标准输出,清空缓冲区。 在处理外部进程时,一定要注意异常处理,确保正确关闭输入、输出和错误流,避免资源泄漏。同时,考虑到跨平台兼容性,可能需要...
在Java编程语言中,有时我们需要实现与操作系统交互的功能,例如执行一些特定的本地应用程序或脚本等。本文将详细介绍如何在Java中调用本地exe文件,并解析提供的代码示例。 ### 一、Java中调用本地exe文件的基本...
原因是`process.waitFor()`会在输入流缓冲区填满之前阻塞,导致进程无法继续输出数据。为了解决这个问题,我们可以使用一个额外的线程来不断地从输入流中读取数据,这样就可以确保数据能够及时被处理,而不会堵塞...
通过调用 Process 对象的 waitFor 方法,可以阻塞当前 JAVA 线程,直到命令执行完毕。 但是,需要注意的是,如果该命令是有标准输出或者是错误输出的话,必须在 waitFor 方法阻塞之前,通过读取 Process 对象的 ...
当执行的DOS程序会产生大量标准输出时,可能导致DOS窗口不会自动关闭,从而阻塞Java程序的`waitfor()`方法。这是因为DOS窗口的标准输出缓冲区可能不足以存储所有输出。为了解决这个问题,可以使用Java的`Process`类...
这可能导致Java应用程序在调用`waitFor()`方法时出现阻塞。 解决此问题的一种方法是在调用`waitFor()`之前先读取DOS窗口的标准输出缓冲区的内容。可以使用Java的`BufferedReader`来实现这一点: ```java String ls...
解决的办法是,利用 Java 提供的 Process 类提供的方法让 Java 虚拟机截获被调用程序的 DOS 运行窗口的标准输出,在 waitfor() 命令之前读出窗口的标准输出缓冲区中的内容。 删除文件 在删除文件时,需要注意 ...
process.waitFor(); } catch (IOException | InterruptedException e) { e.printStackTrace(); } } } ``` 在这个例子中,`/v:`参数指定目标计算机地址,`/u:`参数传递用户名,`/p:`参数传递密码。执行`exec()`...
`process.waitFor()`方法会阻塞直到命令执行完毕。 对于更复杂的命令,如需要参数、环境变量或者管道操作,可以使用`ProcessBuilder`类。例如,下面的代码创建了一个`ProcessBuilder`实例,设置了命令和参数,并将...
在执行之后,可以使用`Process`对象的方法来管理这个子进程,比如`waitFor()`方法可以阻塞当前线程,直到子进程结束。 另外,文档中提到了使用批处理(Batch)文件进行操作。批处理文件通常包含一系列命令,可以一...
- 当被调用的DOS程序有大量的标准输出时,其DOS窗口可能不会自动关闭,导致`waitfor()`方法阻塞。这是因为输出缓冲区可能已满。为解决这个问题,你可以通过`Process`对象的`getInputStream()`方法获取标准输出流,...
int exitCode = process.waitFor(); System.out.println("Process exited with code " + exitCode); ``` 在这个例子中,我们创建了一个ProcessBuilder实例,然后异步地启动进程。通过读取输出流,我们可以在不影响...
`waitFor()`方法会阻塞直到命令执行完毕,返回值是命令的退出状态码,0通常表示成功。 5. **注意安全性和权限** 调用系统命令可能存在安全风险,如潜在的命令注入攻击。因此,确保只传递受信任的输入,并尽可能...
调用`Process.waitFor()`方法可以阻塞当前线程,直到命令执行完成。别忘了关闭输入输出流,防止内存泄漏。 5. **异常处理和错误检查** 通过`Process.exitValue()`检查命令执行是否成功。正常退出时,返回值为0;...
- **等待命令完成**:调用`process.waitFor()`来阻塞当前线程,直到命令执行完成。 - **清理资源**:确保关闭所有打开的流,并且在不再需要进程时调用`process.destroy()`。 3. **示例代码**: 以下是一个简单的...
int exitCode = process.waitFor(); // 等待命令执行完成并获取退出码 BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader....
- `waitFor()`:阻塞当前线程,直到子进程完成。 - `destroy()`:销毁子进程,使其立即终止。 ### 示例代码 下面是一个简单的示例,演示如何使用`Runtime.exec()`来执行Linux命令“ls”: ```java public class ...