调用系统其他进程,未等被启动进程进行完,java主进程就继续往下执行了,本以为调用procc.waitfor()可以解决问题,未果,google之发现如下方法:
代码:
//对process.waitFor()的改造,被启动的进程会因为缓冲区不够而被阻塞无法启动,调用该方法可以成功
public static int doWaitFor(Process p) {
int exitValue = -1; // returned to caller when p is finished
try {
InputStream in = p.getInputStream();
InputStream err = p.getErrorStream();
boolean finished = false; // Set to true when p is finished
while(!finished) {
try {
while( in.available() > 0) {
// Print the output of our system call
Character c = new Character( (char) in.read());
System.out.print( c);
}
while( err.available() > 0) {
// Print the output of our system call
Character c = new Character( (char) err.read());
System.out.print( c);
}
// Ask the process for its exitValue. If the process
// is not finished, an IllegalThreadStateException
// is thrown. If it is finished, we fall through and
// the variable finished is set to true.
exitValue = p.exitValue();
finished = true;
} catch (IllegalThreadStateException e) {
// Process is not finished yet;
// Sleep a little to save on CPU cycles
Thread.currentThread().sleep(500);
}
}
} catch (Exception e) {
// unexpected exception! print it out for debugging...
System.err.println( "doWaitFor(): unexpected exception - " +
e.getMessage());
}
// return completion status to caller
return exitValue;
}
分享到:
相关推荐
最近做一个编程,用C#调用类似ssh,...网上说使用Process.StartInfo,Process.StandardInput,Process.StandOutput之类的,但是每次都在StandardOutput.Read/ReadToEnd卡死,原因复杂,最主要原因是微乳没有做好.下面是个分析 ...
使用Process类重定向时出现阻塞的解决方案 用C#调用类似ssh,ftp,runas,adb shell之类有中间输入,中间输出的.网上说使用Process.StartInfo,Process.StandardInput,Process.StandOutput之类的,但是每次都在...
4. **分析数据**:通过对Process Object View中收集的数据进行分析,你可以发现潜在的问题,比如内存泄漏、CPU过高、进程阻塞等,进而采取相应的解决措施。 5. **故障排查**:当系统出现性能问题或异常时,Process ...
`Process`对象的`waitFor()`方法会阻塞直到进程结束,返回值是进程的退出码: ```java int exitCode = process.waitFor(); System.out.println("Process exited with code: " + exitCode); ``` ### 6. 销毁进程 ...
7. **异步操作**:在处理大量进程或需要避免阻塞主线程的情况下,可以使用异步编程技术,如`async/await`关键字,来实现非阻塞的进程操作。 8. **异常处理**:在处理进程时,可能会遇到各种异常,如进程不存在、无...
例如,你可以通过`pid`属性获取进程ID,`wait`方法阻塞直到子进程结束,`stop`方法可以优雅地关闭子进程(发送SIGTERM,如果未响应则发送SIGKILL),而`io`属性则可以让你设置输入、输出和错误流。 对于更复杂的...
由于Node.js默认是单线程的,当遇到CPU密集型任务时,可能导致阻塞。`child_process`模块允许我们创建子进程来分担计算负载,子进程间可以通过通信进行数据交换。 Node.js提供了四种方式来创建子进程: 1. `child_...
这可以通过进程ID或窗口类名等信息查询得到,可以使用`Process.GetProcessesByName`和`Process.MainWindowHandle`方法。 2. **创建宿主控件**:在你的C#窗体中创建一个控件,如Panel或Grid,作为子窗口的容器。 3....
- `WaitForStatus(ServiceControllerStatus desiredStatus, TimeSpan timeout)`:阻塞调用,直到服务达到指定状态或超时。 5. **安装和卸载服务** 使用`InstallUtil.exe`工具,配合自定义的`ServiceInstaller`和`...
它的核心在于异步进程调度,允许开发者在处理I/O密集型任务时,如网络请求、数据库操作等,不阻塞主线程,从而实现更高的并发处理能力。 AMP框架提供了一系列关键组件: 1. **事件循环(Event Loop)**:事件循环...
快照是一个非常有用的机制,因为它允许你在某个时间点捕获系统状态,而无需阻塞其他进程或线程的执行。函数的返回值是一个`TH32CS_SNAPPROCESS`类型的句柄,这个句柄后续会被`Process32First`和`Process32Next`函数...
1. **后台任务处理**:它可能提供了异步任务处理能力,比如使用Celery或其他异步库来执行耗时操作,而不会阻塞主线程。 2. **进程管理**:对于需要长期运行的任务,如定时任务或监控任务,`django-process`可能提供...
4. **WaitForExit**: 阻塞当前线程,直到进程退出为止。 5. **GetProcesses**: 获取所有正在运行的进程。 6. **GetProcessesByName**: 通过进程名获取所有相关进程。 7. **GetProcessById**: 通过进程ID获取特定进程...
- `Process.WaitForExit()`: 阻塞当前线程,直到进程退出。 - `Process.Exited` 事件:当进程结束时,此事件会被触发,可以在事件处理程序中编写相应的代码。 5. **读取进程输出** - `Process.StandardOutput` ...
4. `waitForFinished()`: 这个函数会阻塞当前线程,直到子进程结束。确保你在适当的时候调用它,以等待子进程完成。 5. `exitCode()`: 可以获取子进程的退出码,这对于判断进程是否成功执行非常有用。 6. `error()...
- 为了防止UI线程阻塞,长任务应该在后台线程中执行,然后通过回调或事件驱动的方式更新进度条。例如,Java的`SwingWorker`,Android的`AsyncTask`,或者JavaScript的Promise。 7. **自定义进度条** - 有时,...
协程在Python、Kotlin等语言中有广泛的应用,常用于实现非阻塞I/O,如在网络请求中,可以一边等待响应,一边处理其他任务。 四、进程(Processes) 进程是操作系统分配资源的基本单位,每个进程都有独立的内存空间...
这种曲线显示了在不同温度和压力下,氨氯化铵从固态转变为气态的特性,这对于理解沉积过程和防止设备堵塞等问题具有重要意义。 综上所述,氮化硅工艺培训材料深入解释了氮化硅薄膜的沉积过程、关键硬件组成、参考...
这可以通过互斥锁(mutex)来实现,它是一种信号量类型,当一个线程获取了锁,其他尝试获取锁的线程将被阻塞,直到该线程释放锁。 压缩包中的子文件“1day”、“4day”、“2day”、“3day”可能是表示项目开发的...