一般我们使用Java运行其他类中的方法的时候,无论是静态调用还是动态调用,都是在当前的进程中执行的。也就是只有一个Java虚拟机实例在运行。有时候需要通过Java代码启动多个Java子进程,这样做会消耗些资源,但是程序变得更稳定。因为新启动的进程是在不同的虚拟机中运行的。

在Windows中,一个虚拟机就是一个


有两种方式调用一个进程

1、System.exec

子进程:

 1 package org.zln.thread;
 2
 3 import java.io.File;
 4 import java.io.IOException;
 5
 6 /**
 7  * Created by coolkid on 2015/6/21 0021.
 8  */
 9 public class TestFile {
10     public static void main(String[] args)  {
11         try {
12             File file = new File("D:\\my.txt");
13             file.createNewFile();
14             System.out.println("被调用成功!");
15
16         } catch (IOException e) {
17             e.printStackTrace();
18         }
19     }
20 }

E:\GitHub\tools\JavaEEDevelop\Lesson1_JavaSe_Demo1\src\org\zln\thread\TestFile.java

主进程:

 1 package org.zln.thread;
 2
 3 import java.io.IOException;
 4
 5 /**
 6  * Created by coolkid on 2015/6/21 0021.
 7  */
 8 public class TestRuntime {
 9     public static void main(String[] args) {
10         String rootPath = "E:\\GitHub\\tools\\JavaEEDevelop\\out\\production\\Lesson1_JavaSe_Demo1";
11         String mainPath = "org.zln.thread.TestFile";
12         String command = "java -classpath "+rootPath+" "+mainPath;
13         Runtime runtime = Runtime.getRuntime();
14         try {
15             System.out.println(command);
16             runtime.exec(command);
17
18         } catch (IOException e) {
19             e.printStackTrace();
20         }
21     }
22 }

E:\GitHub\tools\JavaEEDevelop\Lesson1_JavaSe_Demo1\src\org\zln\thread\TestRuntime.java

调用发现在指定目录下创建了文件,但是并没有在控制台输出信息。因为TestFile子进程并没有自己的控制台,改进代码

 1 package org.zln.thread;
 2
 3 import java.io.*;
 4
 5 /**
 6  * Created by coolkid on 2015/6/21 0021.
 7  */
 8 public class TestRuntime {
 9     public static void main(String[] args) {
10         String rootPath = "E:\\GitHub\\tools\\JavaEEDevelop\\out\\production\\Lesson1_JavaSe_Demo1";
11         String mainPath = "org.zln.thread.TestFile";
12         String command = "java -classpath "+rootPath+" "+mainPath;
13         Runtime runtime = Runtime.getRuntime();
14         try {
15             System.out.println(command);
16             Process process = runtime.exec(command);
17             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new BufferedInputStream(process.getInputStream())));
18             String line;
19             while ((line = bufferedReader.readLine())!=null){
20                 System.out.println("子进程输出:"+line);
21             }
22             bufferedReader.close();
23         } catch (IOException e) {
24             e.printStackTrace();
25         }
26     }
27 }

E:\GitHub\tools\JavaEEDevelop\Lesson1_JavaSe_Demo1\src\org\zln\thread\TestRuntime.java

这里不知为何,在IDE中运行,输出的是乱码,在控制台运行则不是乱码

既然父进程可以获取到子进程的输出,那么父进程如何发送消息给子进程呢?

子进程修改:

 1 package org.zln.thread;
 2
 3 import java.io.BufferedReader;
 4 import java.io.File;
 5 import java.io.IOException;
 6 import java.io.InputStreamReader;
 7
 8 /**
 9  * Created by coolkid on 2015/6/21 0021.
10  */
11 public class TestFile {
12     public static void main(String[] args)  {
13         try {
14             File file = new File("D:\\my.txt");
15             file.createNewFile();
16             System.out.println("被调用成功!");
17
18             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
19             System.out.println("父进程输入信息:"+bufferedReader.readLine());
20
21         } catch (IOException e) {
22             e.printStackTrace();
23         }
24     }
25 }

E:\GitHub\tools\JavaEEDevelop\Lesson1_JavaSe_Demo1\src\org\zln\thread\TestFile.java

父进程修改:

 1 package org.zln.thread;
 2
 3 import java.io.*;
 4
 5 /**
 6  * Created by coolkid on 2015/6/21 0021.
 7  */
 8 public class TestRuntime {
 9     public static void main(String[] args) {
10         String rootPath = "E:\\GitHub\\tools\\JavaEEDevelop\\out\\production\\Lesson1_JavaSe_Demo1";
11         String mainPath = "org.zln.thread.TestFile";
12         String command = "java -classpath "+rootPath+" "+mainPath;
13         Runtime runtime = Runtime.getRuntime();
14         try {
15             System.out.println(command);
16             Process process = runtime.exec(command);
17             /*向子进程输入*/
18             BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
19             bufferedWriter.write("Hello 子进程!");
20             bufferedWriter.close();/*必须现在就关闭,否则无法向子进程输入信息*/
21             /*获取子进程输出*/
22             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new BufferedInputStream(process.getInputStream())));
23             String line;
24             while ((line = bufferedReader.readLine())!=null){
25                 System.out.println("子进程输出:"+line);
26             }
27             bufferedReader.close();
28         } catch (IOException e) {
29             e.printStackTrace();
30         }
31     }
32 }

E:\GitHub\tools\JavaEEDevelop\Lesson1_JavaSe_Demo1\src\org\zln\thread\TestRuntime.java


2、使用ProcessBuilder建立子进程

 1 package org.zln.thread;
 2
 3 import java.io.*;
 4
 5 /**
 6  * Created by coolkid on 2015/6/21 0021.
 7  */
 8 public class TestProcessBuilder {
 9     public static void main(String[] args) throws IOException {
10         ProcessBuilder processBuilder = new ProcessBuilder("java","org.zln.thread.TestFile");
11         /*设置工作目录*/
12         processBuilder.directory(new File("E:\\GitHub\\tools\\JavaEEDevelop\\out\\production\\Lesson1_JavaSe_Demo1"));
13         Process process = processBuilder.start();
14
15          /*向子进程输入*/
16         BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
17         bufferedWriter.write("Hello 子进程!");
18         bufferedWriter.close();/*必须现在就关闭,否则无法向子进程输入信息*/
19             /*获取子进程输出*/
20         BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new BufferedInputStream(process.getInputStream())));
21         String line;
22         while ((line = bufferedReader.readLine())!=null){
23             System.out.println("子进程输出:"+line);
24         }
25         bufferedReader.close();
26
27
28     }
29 }

E:\GitHub\tools\JavaEEDevelop\Lesson1_JavaSe_Demo1\src\org\zln\thread\TestProcessBuilder.java

转载于:https://www.cnblogs.com/sherrykid/p/4592195.html

多线程 调用多线程的方法 Runtime与ProcessBuilder相关推荐

  1. Boost asio学习笔记之一—— 使用strand支持多线程调用service_io的方法

    asio是一个跨平台的网络库,可以作为boost的一部分,也可以使用独立的asio部分.这里记录学习的笔记,作为参考. 感觉asio的关键就是io_service对象.所有的异步同步都跟这个有关.多线 ...

  2. 多线程调用同一个对象的方法_多线程之如何创建和使用线程

    一.创建线程和使用线程方式 1.1 继承Thread 让线程类继承自Thread类,然后重写run(),把需要多线程调用的代码放到run()中.但是需要开启线程的时候不能调用run方法,而是需要调用s ...

  3. 多线程调用同一个对象的方法_这一次,让我们完全掌握Java多线程(2/10)

    多线程不仅是Java后端开发面试中非常热门的一个问题,也是各种高级工具.框架与分布式的核心基石.但是这个领域相关的知识点涉及到了线程调度.线程同步,甚至在一些关键点上还涉及到了硬件原语.操作系统等更底 ...

  4. python如何使用多线程_Python 类中的方法如何多线程调用?

    这么写直接弹框报python运行出错,/尴尬,那这个怎么多线程调用getA/getB/getC/getD/getE呢?每次传参还要循环个arg2list列表 class ThreadTest(): d ...

  5. java多线程中的join方法详解

    java多线程中的join方法详解 方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答. 自从接触Java多线程,一直对Join理解不了.JDK是这样说的:join p ...

  6. Delphi关于多线程同步的一些方法

    (注:本文为转载  http://hi.baidu.com/navy1130/blog/item/468fcdc448794fce38db49ee.html) 线程是进程内一个相对独立的.可调度的执行 ...

  7. 多线程 调用 axis 报错_java笔记录(三、多线程)

    1.进程和线程: 进程:正在进行的程序.每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元. 线程:进程内部的一条执行路径或者一个控制单元. 两者的区别: 一个进程至少有一个线程 ...

  8. Python 3.X 调用多线程C模块,并在C模块中回调python函数的示例

    由于最近在做一个C++面向Python的API封装项目,因此需要用到C扩展Python的相关知识.在此进行简要的总结. 此篇示例分为三部分.第一部分展示了如何用C在Windows中进行多线程编程:第二 ...

  9. 多线程调用生成主键流水号存储过程产生主键冲突问题解决方案

    遇到开发多线程测试插入数据的时候发现主键冲突问题 问题具体描述如下: -------------------------------------------------------------- 调用 ...

最新文章

  1. 深入理解ReentrantLock
  2. 《大话数据结构》第9章 排序 9.2 排序的基本概念与分类
  3. 学习Docker从小白到入门
  4. 宋利:编码既是技术也是艺术
  5. 【ArcGIS遇上Python】ArcGIS Python实现批量化矢量和栅格数据重命名
  6. JPA数据库架构生成
  7. 【Redis】Redis 事务
  8. 结队编程之——阅读分析队友的代码(C++自动生成数学试卷)
  9. win10 java8安装包双击之后完全没反应
  10. 电气绘图软件-AutoCAD Electrical:介绍
  11. cocos2dx lua代码和图片资源加密和解密
  12. 在VS2010中文版中配置OpenGL及问题解决
  13. 字节跳动不需要总部大楼
  14. 明解C语言 入门 课后习题练习答案 第四章(1)
  15. 中文解释“GetLastError()返回值”---错误码大全
  16. 揭秘中国商品期货市场的9大重要因子
  17. HM中CU,TU的划分
  18. python中class 'int'什么意思_#python3type(1)class,'int'为什么和python核心编程里的不一样?...
  19. 【Substance】Substance Painter基本制作流程
  20. 想在PC上随时随地获得4G连接?Acer和金雅拓帮你实现

热门文章

  1. Expression,挑起2006年最后的争论?
  2. 算法 --- 平衡二叉树
  3. echarts --- 多折线图按段显示颜色规则订制
  4. 瓜子二手车发12月二手车价格:汉兰达奥德赛CR-V保值率居首
  5. SocketErrorCode:10022
  6. CodeForces-500C
  7. Loadrunner多服务器连接问题
  8. background-size
  9. Hyper-v 2016 VHD Set
  10. 快速上手Ubuntu搭建Python编程环境