多线程 调用多线程的方法 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu14.04 python2.7 安装配置OpenCV3.0

环境:ubuntu14.04 python2.7 内容:安装并配置OpenCV3.0 今天按照OpenCV官网上的步骤装了OpenCV但是,装好之后python提示“No module named cv2” 首先,安装OpenCV的步骤: OpenCV官网的安装步骤:http://doc…

[iOS] Win8下在Vmware11中安装使用苹果系统OS X 10.10

近来因为人事变动,领导打算安排我做 iOS 的项目,所以需要花一些时间提前准备一下iOS相关的东西。因为自己手头上并没有 Mac(过年为了闲的时候能玩玩游戏买了联想,唉),想想不能只靠每天在公司的时间练 demo …

html5的网络书店图书网站代码_【技能提升】10个编写HTML5的实用小技巧

1. 新的文档类型(Doctype)html PUBLIC ”-//W3C//DTD XHTML 1.0 Transitional//EN”“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>上面这个既麻烦又难记的XHTML文档类型你还在使用吗?如果还是这样的话,现在该切换到新的HTML5文档类型…

sql中if语句的用法_Python中的if条件语句

Python中的if语句在实际的编程中,经常需要检查一系列条件,并据此决定采取什么措施。正常情况下,程序的执行是自上而下的进行,if语句则根据条件判断,实现程序的执行顺序改变。一、if-else语句1、语法:if 条件…

mysql中non用什么_mysql Non-Transactional Database Only(只支持MyISAM)

后来在做WordPress,一开始还不知道原来WordPress用的是InnoDB数据引擎,于是在原来的数据库里面就建了一个数据库,一开始也没发觉问题,安装,导入sql,都没问题,当时也没多想。直到这几天因为又要装多一个Word…

timed_waiting线程是否占用cpu_程序CPU占用率飙升,如何定位线程的堆栈信息?超详细,值得收藏看不懂还有配套视频 第319篇...

相关历史文章(阅读本文前,您可能需要先看下之前的系列?)国内最全的Spring Boot系列之三2020上半年发文汇总「值得收藏」GraphQL的探索之路 – SpringBoot集成GraphQL小栗子篇二 - 第315篇GraphQL的探索之路 – SpringBoot集成GraphQL之Query篇三 - 第316篇GraphQL的…

sql多层嵌套别名无效_SQL之复杂查询

前文学了汇总分析,学了常见的汇总函数,会分组并且掌握了对分组结果指定条件。今天开始学习SQL的视图和子查询,还有数据库关联与嵌套查询内容的学习。一、视图1.1视图是有单固定存储可反复读取使用的子查询,所以视图适用于频繁使用…

POJ 1195 Mobile phones【 二维树状数组 】

题意&#xff1a;基础的二维数组&#xff0c;注意 0 lowbit(0)会陷入无限循环----- 之前做一道一维的一直tle,就是因为这个-------------------------- 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #includ…

基于Angularjs实现分页

前言 学习任何一门语言前肯定是有业务需求来驱动你去学习它&#xff0c;当然ng也不例外&#xff0c;在学习ng前我第一个想做的demo就是基于ng实现分页&#xff0c;除去基本的计算思路外就是使用指令封装成一个插件&#xff0c;在需要分页的列表页面内直接引用。 插件 在封装分页…

mbot机器人初体验_[首发开箱]Makeblock mBot Ranger mBot游侠版 强大的STEM教育机器人...

本帖最后由 ahagowo 于 2016-4-17 08:38 编辑mBot游侠机器人套件是一个三种功能于一身的STEM教育机器人套件&#xff0c;它支持3种组装形态&#xff1a;机器人坦克&#xff0c;三轮赛车&#xff0c;和自平衡车。mBot游侠可通过 iPad&#xff0c;平板计算机或笔记本计算机来编程…

python课程笔记_Python课程笔记(一)

由于新冠状病毒的爆发&#xff0c;不得不在家里上网课&#xff0c;开课已经两个礼拜了&#xff0c;今天上完Python课后&#xff0c;准备整理一下最近学习Python的笔记。人生苦短&#xff0c;我用Python一、Hello World初学一门新的语言&#xff0c;就一定要从Hello World开始pr…

redis的lrange_thinkphp5操作redis系列教程】列表类型之lRange,lGetRange

namespace app\admin\controller;use think\cache\driver\Redis;use think\Controller;use \think\Db;class Index extends Controller{//获取redispublic function getRedis(){$redis new \Redis();$redis->connect(127.0.0.1,6379);$redis->auth(root); //redis密码ec…

云服务器建站原理_云服务器cvm与建站主机之间的区别

(文章来源&#xff1a;西部数码)云服务器cvm与建站主机区别是什么&#xff1f;cvm的英文全拼是CloudVirtualMachine(云虚拟机)&#xff0c;所以云服务器cvm是指虚拟云服务器&#xff0c;属于云服务器产品中的一种。而建站主机一般多是指虚拟主机&#xff0c;是在服务器中划分出…

maven找到mysql 连接池_在Tomcat6.0+MySQL5.0环境下配置和使用数据库连接池

一&#xff0c;在Tomcat中配置连接池的JNDI首先到MySQL的网站上下载MySQL JDBC连接器放到%CATALINA_HOME%/lib目录下&#xff0c;在%CATALINA_HOME%/conf目录下找到context.xml&#xff0c;这个文件是全局的&#xff0c;如果想只对特定的应用使用可以编辑WEB-INF/context.xml文…

mysql将多个成绩放在一排_mysql巧用连表查询各科成绩前三名

下列是各表的详情&#xff0c;不想自己建表的同学可以直接copy code&#xff0c;数据随意。创建表成绩详情表&#xff1a;CREATE TABLE score (id int(10) NOT NULL AUTO_INCREMENT,subject_id int(10) DEFAULT NULL,student_id int(10) DEFAULT NULL,score float DEFAULT NULL…

LeetCode Contains Duplicate (判断重复元素)

题意&#xff1a; 如果所给序列的元素不是唯一的&#xff0c;则返回true&#xff0c;否则false。 思路&#xff1a; 哈希map解决。 1 class Solution {2 public:3 bool containsDuplicate(vector<int>& nums) {4 unordered_map<int,int> mapp;5 …

提高团队代码质量

近期看到一篇博客。大致的意思就是网管将原本混乱不堪的交换机整理整齐了&#xff0c;起初交换机是图2那样的&#xff0c;由于越来用的人越多&#xff0c;操作的人越来越多。终于成为了图1那个样子。这不禁让我想到了项目中的代码。原先在刚上线的时候谈不上是完美的&#xff0…

webrender 查看是否开启_想要体验极致顺滑的网页加载体验?手动开启Firefox WebRender渲染引擎...

昨天我们提到火狐浏览器最新稳定版Mozilla Firefox v67 版将面向部分用户开启WebRender渲染引擎测试。据火狐浏览器团队介绍当用户开启新的渲染引擎后 , 网页加载帧率能够从现有的 20FPS 直接提升到 60FPS。不过新的渲染引擎本身并不是用于加快网页的加载速度&#xff0c;而是…

NOIP201307货车运输

试题描述A 国有n座城市&#xff0c;编号从1到n&#xff0c;城市之间有m条双向道路。每一条道路对车辆都有重量限制&#xff0c;简称限重。现在有q辆货车在运输货物&#xff0c;司机们想知道每辆车在不超过车辆限重的情况下&#xff0c;最多能运多重的货物。输入第一行有两个用一…

knime如何连接mysql_knime怎么连接MySQL?

首先判断一下网络是否通&#xff1a;如果在局域网相同网段内那网络是通的&#xff0c;不同网段间需要看是否有做隔离&#xff0c;如果没有隔离&#xff0c;那就也是通的。测试方法可以用telnet 数据库IP 数据库端口号的方式探测一下 例如 telnet 192.168. 1.124 3306创建用户&a…