多线程 调用多线程的方法 Runtime与ProcessBuilder
一般我们使用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相关推荐
- Boost asio学习笔记之一—— 使用strand支持多线程调用service_io的方法
asio是一个跨平台的网络库,可以作为boost的一部分,也可以使用独立的asio部分.这里记录学习的笔记,作为参考. 感觉asio的关键就是io_service对象.所有的异步同步都跟这个有关.多线 ...
- 多线程调用同一个对象的方法_多线程之如何创建和使用线程
一.创建线程和使用线程方式 1.1 继承Thread 让线程类继承自Thread类,然后重写run(),把需要多线程调用的代码放到run()中.但是需要开启线程的时候不能调用run方法,而是需要调用s ...
- 多线程调用同一个对象的方法_这一次,让我们完全掌握Java多线程(2/10)
多线程不仅是Java后端开发面试中非常热门的一个问题,也是各种高级工具.框架与分布式的核心基石.但是这个领域相关的知识点涉及到了线程调度.线程同步,甚至在一些关键点上还涉及到了硬件原语.操作系统等更底 ...
- python如何使用多线程_Python 类中的方法如何多线程调用?
这么写直接弹框报python运行出错,/尴尬,那这个怎么多线程调用getA/getB/getC/getD/getE呢?每次传参还要循环个arg2list列表 class ThreadTest(): d ...
- java多线程中的join方法详解
java多线程中的join方法详解 方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答. 自从接触Java多线程,一直对Join理解不了.JDK是这样说的:join p ...
- Delphi关于多线程同步的一些方法
(注:本文为转载 http://hi.baidu.com/navy1130/blog/item/468fcdc448794fce38db49ee.html) 线程是进程内一个相对独立的.可调度的执行 ...
- 多线程 调用 axis 报错_java笔记录(三、多线程)
1.进程和线程: 进程:正在进行的程序.每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元. 线程:进程内部的一条执行路径或者一个控制单元. 两者的区别: 一个进程至少有一个线程 ...
- Python 3.X 调用多线程C模块,并在C模块中回调python函数的示例
由于最近在做一个C++面向Python的API封装项目,因此需要用到C扩展Python的相关知识.在此进行简要的总结. 此篇示例分为三部分.第一部分展示了如何用C在Windows中进行多线程编程:第二 ...
- 多线程调用生成主键流水号存储过程产生主键冲突问题解决方案
遇到开发多线程测试插入数据的时候发现主键冲突问题 问题具体描述如下: -------------------------------------------------------------- 调用 ...
最新文章
- 深入理解ReentrantLock
- 《大话数据结构》第9章 排序 9.2 排序的基本概念与分类
- 学习Docker从小白到入门
- 宋利:编码既是技术也是艺术
- 【ArcGIS遇上Python】ArcGIS Python实现批量化矢量和栅格数据重命名
- JPA数据库架构生成
- 【Redis】Redis 事务
- 结队编程之——阅读分析队友的代码(C++自动生成数学试卷)
- win10 java8安装包双击之后完全没反应
- 电气绘图软件-AutoCAD Electrical:介绍
- cocos2dx lua代码和图片资源加密和解密
- 在VS2010中文版中配置OpenGL及问题解决
- 字节跳动不需要总部大楼
- 明解C语言 入门 课后习题练习答案 第四章(1)
- 中文解释“GetLastError()返回值”---错误码大全
- 揭秘中国商品期货市场的9大重要因子
- HM中CU,TU的划分
- python中class 'int'什么意思_#python3type(1)class,'int'为什么和python核心编程里的不一样?...
- 【Substance】Substance Painter基本制作流程
- 想在PC上随时随地获得4G连接?Acer和金雅拓帮你实现