多线程 调用多线程的方法 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允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), 将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避 ...
随机推荐
- Linux centos7 安装python3 及 GCC
1.用wget下载python源码 PYTHON下载 找适合自己的版本,我下载的是3.7.2 2.用tar命令解压下载的文件 tar -zxvf Python-3.7.2.tgz 3.进入目录解压后的 ...
- jQuery-qrcode.js 生成带Logo 的二维码
引入文件 jQuery-qrcode.js 地址:https://blog-static.cnblogs.com/files/kitty-blog/jquery-qrcode.js https:// ...
- django之多表查询
一.创建模型 在Models创建如下模型: from django.db import models # Create your models here. # 用了OneToOneField和Fore ...
- narcissus
public class narcissus { public static void main(String args[]) { long u=0,t=0,h=0,y=0,k=0; for(long ...
- "Mon Dec 31 00:00:00 CST 2012" java日期装换 "yyyy-MM-dd"
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import ja ...
- .NET CORE LOG
.NET CORE LOG 合格的应用程序不仅要求运行的高效和计算的准确,稳定及可靠性也要得到满足,同事,系统的可维护性也相当重要.谈及到可维护性,就必须涉及到系统运行状态的监控和异常的快速定位与跟踪 ...
- Ubuntu14.04安装opencv2.4.13
本文参考相关链接:http://blog.csdn.net/honyniu/article/details/46390097 系 统:Ubuntu 14.04 x64 opencv版本:2.4.1 ...
- 【EXCEL】SUMIF(条件を指定して数値を合計する)
Mirocrosoft Excel
- java 解析xml 多命名空间问题
先贴段有命名空间的xml吧.. <feed xmlns:im="http://itunes.apple.com/rss" xmlns="http://www.w3. ...
- c/c++容器操作
C++中的容器大致可以分为两个大类:顺序容器和关联容器.顺序容器中包含有顺序容器适配器. 顺序容器:将单一类型元素聚集起来成为容器,然后根据位置来存储和访问这些元素.主要有vector.list.de ...