`
Tiwen
  • 浏览: 86324 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JAVA进程waitFor() 阻塞总结

阅读更多

最近在忙着一个模块的架构,先前采用的是单进程多线程的模式运行,因为可以很好管理。后来为了提高效率,必须把一群不断运行的线程放出去,好比分配房间样子,大伙再不用拘束在一个房间形成拥挤的状态了。

原来启动一个线程任务的时候是 把容器里存活对象开启它的状态,现在演变成生成一个线程,线程再去启动一个进程,从而把任务分配出去执行,但是,在一个线程启动一个进程后,因为要设计到数据通信,比如要等子进程完成后把子进程的结果返回回来。线程启动它后不可以被挂起。所有子进程需要在一个方法内存活。执行完毕后线程剩下的代码继续执行。后来发现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并发进程开发手册知识点概览 #### 一、引言 《Java并发进程开发手册》是一本关于Java多线程编程的专业书籍,由Doug Lea编写,Addison Wesley出版社于1999年10月出版。本书针对Java 2平台进行了全面更新,并...

    JAVA Process 使用

    `Process`对象的`waitFor()`方法会阻塞直到进程结束,返回值是进程的退出码: ```java int exitCode = process.waitFor(); System.out.println("Process exited with code: " + exitCode); ``` ### 6. 销毁进程 ...

    黑马程序员入学Java知识(精华总结)

    ### 黑马程序员入学Java知识(精华总结) #### 一、Java概述与基础知识 ##### 1、何为编程? 编程是指使用计算机语言来编写指令,这些指令被计算机执行以完成特定任务的过程。通过编程,我们可以控制计算机的行为...

    java精华总结

    ### Java精华总结 #### 一、Java概述与基础知识 ##### 1. 何为编程? 编程是一种通过编写计算机可以理解的指令来解决问题的过程。这些指令是按照特定的语法规则组织起来的,用来指导计算机执行特定任务。 ##### ...

    Java多线程编程总结

    Java线程有五种状态:新建、可运行、运行、阻塞和死亡。线程可以通过`sleep()`、`join()`、`wait()`、`notify()`和`notifyAll()`等方法进行同步和协作。 **六、线程的优先级与调度** Java中的线程有10个优先级,`...

    java中调用本地exe文件

    这个方法会阻塞当前线程直到子进程结束为止。这样可以确保我们在继续执行后续代码之前,等待记事本程序完全关闭。 #### 2.3 `p.exitValue()`方法 获取子进程的退出状态码。通常情况下,如果程序正常结束,则返回值...

    Java调用Linux命令

    - `waitFor()`:阻塞当前线程,直到子进程完成。 - `destroy()`:销毁子进程,使其立即终止。 ### 示例代码 下面是一个简单的示例,演示如何使用`Runtime.exec()`来执行Linux命令“ls”: ```java public class ...

    java 查看JVM中所有的线程的活动状况

    在命令行中运行`jstack <pid>`(pid是Java进程的ID),即可查看该进程的线程状态。 总结来说,Java提供了多种方式来查看JVM中的线程活动状况,无论是通过编程还是使用命令行工具,都能帮助开发者诊断和优化多线程...

    JAVA如何调用DOS命令

    在 Windows 平台上,运行被调用程序的 DOS 窗口在程序执行完毕后往往并不会自动关闭,从而导致 Java 应用程序阻塞在 waitfor()。解决的办法是,利用 Java 提供的 Process 类提供的方法让 Java 虚拟机截获被调用程序...

    JAVA调用DOS命令.pdf

    否则,调用 waitFor 方法将不会阻塞当前 JAVA 线程,而是死锁,程序会一直悬挂在那里。 对于像 dir 这样的 DOS 内部命令,直接使用 Runtime.getRuntime().exec("dir") 是会抛出 I/O 异常的,因为系统中并不存在叫 ...

    java调用windows命令

    process.waitFor(); ``` 5. **删除文件** - 使用`Runtime.getRuntime().exec()`删除文件时,必须包含命令解释器,例如: ```java Process process = Runtime.getRuntime().exec("cmd /c del f:\\aaa.doc"); `...

    java执行可执行文件或批处理

    需要注意的是,如果命令的执行时间过长,`waitFor()`方法也会阻塞较长时间,因此在实际应用中要考虑到这一点。 ### 总结 通过Java的`Runtime`类,我们可以轻松地执行外部的可执行文件和批处理文件。这种方式不仅...

    Java调用本地的远程桌面连接

    process.waitFor(); } catch (IOException | InterruptedException e) { e.printStackTrace(); } } } ``` 在这个例子中,`/v:`参数指定目标计算机地址,`/u:`参数传递用户名,`/p:`参数传递密码。执行`exec()`...

    后端JAVA虚拟机JVM调优必备工具

    IBM Thread and Monitor Dump Analyzer for Java专业JVM调优工具 一、使用方法 1.使用java -jar启动程序 2.找到需要分析的jvm进程 3.使用jstack [pid] > /tmp/sdapjvmlog.txt导出进程的详细日志 4.使用程序打开...

    Java调用linux shell脚本的方法

    4. **等待脚本执行完成**:`waitFor()`方法会阻塞当前线程,直到调用的进程结束。确保在读取输出流之后调用`waitFor()`,这样可以确保脚本执行完毕并且所有输出已被处理。 5. **异常处理**:在实际应用中,还需要...

    php多进程框架-模拟java多线程接口simple-fork-php.zip

    获取进程状态(调用isAlive()方法)前,最好调用一个无阻塞的wait(false)进行一次回收,由于进程运行状态的判断不是原子操作,所以isAlive()方法不保证与实际状态完全一致 如果你不清楚在什么情况下...

    Java cmd命令行模拟工具

    `process.waitFor()`方法会阻塞直到命令执行完毕。 对于更复杂的命令,如需要参数、环境变量或者管道操作,可以使用`ProcessBuilder`类。例如,下面的代码创建了一个`ProcessBuilder`实例,设置了命令和参数,并将...

Global site tag (gtag.js) - Google Analytics