最近在忙着一个模块的架构,先前采用的是单进程多线程的模式运行,因为可以很好管理。后来为了提高效率,必须把一群不断运行的线程放出去,好比分配房间样子,大伙再不用拘束在一个房间形成拥挤的状态了。
原来启动一个线程任务的时候是 把容器里存活对象开启它的状态,现在演变成生成一个线程,线程再去启动一个进程,从而把任务分配出去执行,但是,在一个线程启动一个进程后,因为要设计到数据通信,比如要等子进程完成后把子进程的结果返回回来。线程启动它后不可以被挂起。所有子进程需要在一个方法内存活。执行完毕后线程剩下的代码继续执行。后来发现waitFor()方法。挺不错,可以解决让子进程在线程的RUN方法就执行完毕,后来发现这个方法并不是想象的那么美好。它成功的停止了代码继续执行,同时它也阻塞了子进程的执行,因为子进程在测试的时候需要及时汇报信息和错误信息,如下对代码进行修改,初步上解决了waitFor()方法阻塞问题
新建一个线程类或者它为内部类
class StreamGobbler extends Thread
{
InputStream is;
String type;
StreamGobbler(InputStream is, String type)
{
this.is = is;
this.type = type;
}
public void run()
{
try
{
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line=null;
while ( (line = br.readLine()) != null)
System.out.println(type + ">" + line);
} catch (IOException ioe)
{
ioe.printStackTrace();
}
}
}
创建子进程的RUN方法
Process proc = Runtime.getRuntime().exec("java com.zjdw.course.Assign " + path);
new StreamGobbler(proc.getInputStream(),"INFO").start();
new StreamGobbler(proc.getErrorStream(),"ERROR").start();
int status = proc.waitFor();
if (status == 0)
System.out.println("执行完毕");
else
System.out.println("执行失败");
这样就可以解决阻塞问题了。
分享到:
相关推荐
使用`waitFor()`方法可以阻塞当前线程,直到子进程结束: ```java int exitCode = process.waitFor(); if (exitCode == 0) { System.out.println("Process completed successfully."); } else { System.out....
例如,可以使用`ProcessBuilder.start()`方法创建新进程,`Process.waitFor()`方法使当前线程等待子进程完成,以及`Process.destroy()`方法来结束进程。 三、Java与操作系统进程状态的关系 Java虚拟机(JVM)自身...
然而,这样的操作可能会遇到一个常见的问题,即Java进程执行外部程序时发生阻塞,导致程序运行停滞。这个问题可能由多种原因引起,但在这里我们将重点关注一个具体的因素:输出流未被正确处理。 当Java进程执行外部...
### Java并发进程开发手册知识点概览 #### 一、引言 《Java并发进程开发手册》是一本关于Java多线程编程的专业书籍,由Doug Lea编写,Addison Wesley出版社于1999年10月出版。本书针对Java 2平台进行了全面更新,并...
`Process`对象的`waitFor()`方法会阻塞直到进程结束,返回值是进程的退出码: ```java int exitCode = process.waitFor(); System.out.println("Process exited with code: " + exitCode); ``` ### 6. 销毁进程 ...
### 黑马程序员入学Java知识(精华总结) #### 一、Java概述与基础知识 ##### 1、何为编程? 编程是指使用计算机语言来编写指令,这些指令被计算机执行以完成特定任务的过程。通过编程,我们可以控制计算机的行为...
### Java精华总结 #### 一、Java概述与基础知识 ##### 1. 何为编程? 编程是一种通过编写计算机可以理解的指令来解决问题的过程。这些指令是按照特定的语法规则组织起来的,用来指导计算机执行特定任务。 ##### ...
Java线程有五种状态:新建、可运行、运行、阻塞和死亡。线程可以通过`sleep()`、`join()`、`wait()`、`notify()`和`notifyAll()`等方法进行同步和协作。 **六、线程的优先级与调度** Java中的线程有10个优先级,`...
这个方法会阻塞当前线程直到子进程结束为止。这样可以确保我们在继续执行后续代码之前,等待记事本程序完全关闭。 #### 2.3 `p.exitValue()`方法 获取子进程的退出状态码。通常情况下,如果程序正常结束,则返回值...
- `waitFor()`:阻塞当前线程,直到子进程完成。 - `destroy()`:销毁子进程,使其立即终止。 ### 示例代码 下面是一个简单的示例,演示如何使用`Runtime.exec()`来执行Linux命令“ls”: ```java public class ...
在命令行中运行`jstack <pid>`(pid是Java进程的ID),即可查看该进程的线程状态。 总结来说,Java提供了多种方式来查看JVM中的线程活动状况,无论是通过编程还是使用命令行工具,都能帮助开发者诊断和优化多线程...
在 Windows 平台上,运行被调用程序的 DOS 窗口在程序执行完毕后往往并不会自动关闭,从而导致 Java 应用程序阻塞在 waitfor()。解决的办法是,利用 Java 提供的 Process 类提供的方法让 Java 虚拟机截获被调用程序...
否则,调用 waitFor 方法将不会阻塞当前 JAVA 线程,而是死锁,程序会一直悬挂在那里。 对于像 dir 这样的 DOS 内部命令,直接使用 Runtime.getRuntime().exec("dir") 是会抛出 I/O 异常的,因为系统中并不存在叫 ...
process.waitFor(); ``` 5. **删除文件** - 使用`Runtime.getRuntime().exec()`删除文件时,必须包含命令解释器,例如: ```java Process process = Runtime.getRuntime().exec("cmd /c del f:\\aaa.doc"); `...
需要注意的是,如果命令的执行时间过长,`waitFor()`方法也会阻塞较长时间,因此在实际应用中要考虑到这一点。 ### 总结 通过Java的`Runtime`类,我们可以轻松地执行外部的可执行文件和批处理文件。这种方式不仅...
process.waitFor(); } catch (IOException | InterruptedException e) { e.printStackTrace(); } } } ``` 在这个例子中,`/v:`参数指定目标计算机地址,`/u:`参数传递用户名,`/p:`参数传递密码。执行`exec()`...
IBM Thread and Monitor Dump Analyzer for Java专业JVM调优工具 一、使用方法 1.使用java -jar启动程序 2.找到需要分析的jvm进程 3.使用jstack [pid] > /tmp/sdapjvmlog.txt导出进程的详细日志 4.使用程序打开...
4. **等待脚本执行完成**:`waitFor()`方法会阻塞当前线程,直到调用的进程结束。确保在读取输出流之后调用`waitFor()`,这样可以确保脚本执行完毕并且所有输出已被处理。 5. **异常处理**:在实际应用中,还需要...
获取进程状态(调用isAlive()方法)前,最好调用一个无阻塞的wait(false)进行一次回收,由于进程运行状态的判断不是原子操作,所以isAlive()方法不保证与实际状态完全一致 如果你不清楚在什么情况下...
`process.waitFor()`方法会阻塞直到命令执行完毕。 对于更复杂的命令,如需要参数、环境变量或者管道操作,可以使用`ProcessBuilder`类。例如,下面的代码创建了一个`ProcessBuilder`实例,设置了命令和参数,并将...