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

有两种方式调用一个进程
1、System.exec
子进程:
package org.zln.thread; import java.io.File;
import java.io.IOException; /**
* Created by coolkid on 2015/6/21 0021.
*/
public class TestFile {
public static void main(String[] args) {
try {
File file = new File("D:\\my.txt");
file.createNewFile();
System.out.println("被调用成功!"); } catch (IOException e) {
e.printStackTrace();
}
}
}
E:\GitHub\tools\JavaEEDevelop\Lesson1_JavaSe_Demo1\src\org\zln\thread\TestFile.java
主进程:
package org.zln.thread; import java.io.IOException; /**
* Created by coolkid on 2015/6/21 0021.
*/
public class TestRuntime {
public static void main(String[] args) {
String rootPath = "E:\\GitHub\\tools\\JavaEEDevelop\\out\\production\\Lesson1_JavaSe_Demo1";
String mainPath = "org.zln.thread.TestFile";
String command = "java -classpath "+rootPath+" "+mainPath;
Runtime runtime = Runtime.getRuntime();
try {
System.out.println(command);
runtime.exec(command); } catch (IOException e) {
e.printStackTrace();
}
}
}
E:\GitHub\tools\JavaEEDevelop\Lesson1_JavaSe_Demo1\src\org\zln\thread\TestRuntime.java
调用发现在指定目录下创建了文件,但是并没有在控制台输出信息。因为TestFile子进程并没有自己的控制台,改进代码
package org.zln.thread; import java.io.*; /**
* Created by coolkid on 2015/6/21 0021.
*/
public class TestRuntime {
public static void main(String[] args) {
String rootPath = "E:\\GitHub\\tools\\JavaEEDevelop\\out\\production\\Lesson1_JavaSe_Demo1";
String mainPath = "org.zln.thread.TestFile";
String command = "java -classpath "+rootPath+" "+mainPath;
Runtime runtime = Runtime.getRuntime();
try {
System.out.println(command);
Process process = runtime.exec(command);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new BufferedInputStream(process.getInputStream())));
String line;
while ((line = bufferedReader.readLine())!=null){
System.out.println("子进程输出:"+line);
}
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
E:\GitHub\tools\JavaEEDevelop\Lesson1_JavaSe_Demo1\src\org\zln\thread\TestRuntime.java
这里不知为何,在IDE中运行,输出的是乱码,在控制台运行则不是乱码
既然父进程可以获取到子进程的输出,那么父进程如何发送消息给子进程呢?
子进程修改:
package org.zln.thread; import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader; /**
* Created by coolkid on 2015/6/21 0021.
*/
public class TestFile {
public static void main(String[] args) {
try {
File file = new File("D:\\my.txt");
file.createNewFile();
System.out.println("被调用成功!"); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("父进程输入信息:"+bufferedReader.readLine()); } catch (IOException e) {
e.printStackTrace();
}
}
}
E:\GitHub\tools\JavaEEDevelop\Lesson1_JavaSe_Demo1\src\org\zln\thread\TestFile.java
父进程修改:
package org.zln.thread; import java.io.*; /**
* Created by coolkid on 2015/6/21 0021.
*/
public class TestRuntime {
public static void main(String[] args) {
String rootPath = "E:\\GitHub\\tools\\JavaEEDevelop\\out\\production\\Lesson1_JavaSe_Demo1";
String mainPath = "org.zln.thread.TestFile";
String command = "java -classpath "+rootPath+" "+mainPath;
Runtime runtime = Runtime.getRuntime();
try {
System.out.println(command);
Process process = runtime.exec(command);
/*向子进程输入*/
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
bufferedWriter.write("Hello 子进程!");
bufferedWriter.close();/*必须现在就关闭,否则无法向子进程输入信息*/
/*获取子进程输出*/
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new BufferedInputStream(process.getInputStream())));
String line;
while ((line = bufferedReader.readLine())!=null){
System.out.println("子进程输出:"+line);
}
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
E:\GitHub\tools\JavaEEDevelop\Lesson1_JavaSe_Demo1\src\org\zln\thread\TestRuntime.java
2、使用ProcessBuilder建立子进程
package org.zln.thread; import java.io.*; /**
* Created by coolkid on 2015/6/21 0021.
*/
public class TestProcessBuilder {
public static void main(String[] args) throws IOException {
ProcessBuilder processBuilder = new ProcessBuilder("java","org.zln.thread.TestFile");
/*设置工作目录*/
processBuilder.directory(new File("E:\\GitHub\\tools\\JavaEEDevelop\\out\\production\\Lesson1_JavaSe_Demo1"));
Process process = processBuilder.start(); /*向子进程输入*/
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
bufferedWriter.write("Hello 子进程!");
bufferedWriter.close();/*必须现在就关闭,否则无法向子进程输入信息*/
/*获取子进程输出*/
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new BufferedInputStream(process.getInputStream())));
String line;
while ((line = bufferedReader.readLine())!=null){
System.out.println("子进程输出:"+line);
}
bufferedReader.close(); }
}
E:\GitHub\tools\JavaEEDevelop\Lesson1_JavaSe_Demo1\src\org\zln\thread\TestProcessBuilder.java
多线程 调用多线程的方法 Runtime与ProcessBuilder的更多相关文章
- 调用webservice客户端方法 runtime modeler error: Wrapper class ××× is not found. Have you run APT to generate them?
用wsimport生成webservice的客户端以后,调用客户端生成方法时总是出现 runtime modeler error: Wrapper class stardand.nrcms.nckin ...
- ASP.Net:Javascript 通过PageMethods 调用后端WebMethod方法 + 多线程数据处理 示例
ASP.Net:Javascript 通过PageMethods 调用后端WebMethod方法 + 多线程数据处理 示例 2012年04月27日 16:59:16 奋斗的小壁虎 阅读数:4500 ...
- C# 多线程调用静态方法或者静态实例中的同一个方法-方法内部的变量是线程安全的
C# 多线程调用静态方法或者静态实例中的同一个方法-方法内部的变量是线程安全的 using System;using System.Threading;using System.Threading. ...
- 多线程调用有参数的方法---c# Thread 与 Task
C#实现多线程的方式:Task——任务 简介 .NET 4包含新名称空间System.Threading.Tasks,它 包含的类抽象出了线程功能. 在后台使用ThreadPool. 任务表示应完 ...
- PHP中实现异步调用多线程程序代码
本文章详细的介绍了关于PHP中实现异步调用多线程方法,下面我们以给1000个用户发送一封推荐邮件,用户输入或者导入邮件账号了提交服务器执行发送来讲述. 比如现在有一个场景,给1000个用户发送一封推荐 ...
- Python 3.X 调用多线程C模块,并在C模块中回调python函数的示例
由于最近在做一个C++面向Python的API封装项目,因此需要用到C扩展Python的相关知识.在此进行简要的总结. 此篇示例分为三部分.第一部分展示了如何用C在Windows中进行多线程编程:第二 ...
- 2.匿名类,匿名类对象,private/protected/public关键字、abstract抽象类,抽象方法、final关键字的使用,多线程Thread类start方法原理
package com.bawei.multithread; //注意:模板方法我们通常使用抽象类或者抽象方法!这里我们为了方便在本类中使用就没有使用抽象类/抽象方法 public class Tem ...
- java多线程中用到的方法详细解析
在多线程学习的过程中涉及的方法和接口特别多,本文就详细讲解下经常使用方法的作用和使用场景. 1.sleep()方法. 当线程对象调用sleep(time)方法后,当前线程会等待指定的时间(t ...
- 牛客网Java刷题知识点之多线程同步的实现方法有哪些
不多说,直接上干货! 为何要使用同步? java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), 将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避 ...
随机推荐
- mysql主从延时临时解决办法
主从延时临时解决办法: 主从延迟严重的原因很多,其中有以下原因: 一.由于无主键大表的delete 和update导致. mysql 主从复制时.如果表上没有主键.会导致update和delete操 ...
- 利用python实现《数据挖掘——概念与技术》一书中描述的Apriori算法
from itertools import combinations data = [['I1', 'I2', 'I5'], ['I2', 'I4'], ['I2', 'I3'], ['I1', 'I ...
- python核心编程2 第九章 练习
9–1. 文件过滤. 显示一个文件的所有行, 忽略以井号( # )开头的行. 这个字符被用做Python , Perl, Tcl, 等大多脚本文件的注释符号.附加题: 处理不是第一个字符开头的注释. ...
- python实现归并排序,归并排序的详细分析
python实现归并排序,归并排序的详细分析. 学习归并排序的过程是十分痛苦的.它并不常用,看起来时间复杂度好像是几种排序中最低的,比快排的时间复杂度还要低,但是它的执行速度不是最快的.很多朋友不 ...
- Mysql 查看连接数,状态,最大并发数
MySQL: ERROR 1040: Too many connections”的异常情况,造成这种情况的一种原因是访问量过高,MySQL服务器抗不住,这个时候就要考虑增加从服务器分散读压力:另一种原 ...
- PHP (Yii2) 自定义业务异常类(可支持返回任意自己想要的类型数据)
public function beforeAction($action) { return parent::beforeAction($action); } public function runA ...
- ruby Dir类
类方法 1. Dir[pat] Dir::glob( pat) 返回一个数组,包含与指定的通配符模式 pat 匹配的文件名: * - 匹配包含 null 字符串的任意字符串 ** - 递归地匹配 ...
- 【Markdown】Markdown的使用(自用)
# 欢迎使用 Cmd Markdown 编辑阅读器 我们理解您需要更便捷更高效的工具记录思想,整理笔记.知识,并将其中承载的价值传播给他人,Cmd Markdown 是我们给出的答案 -- 我们为记录 ...
- C中 snprintf()函数的作用
函数原型:int snprintf(char* dest_str,size_t size,const char* format,...); 函数功能:先将可变参数 “…” 按照format的格式格式化 ...
- node session会话
会话机制: 浏览器-->服务器 浏览器<--服务器 (产生一个会话id,保存在cookie中) 浏览器-->服务器(服务器根据会话id关联到相应数据信息体data) var expr ...