多线程 调用多线程的方法 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,一经查实,立即删除!

相关文章

mysql可连接_mysql开启远程可连接

1.打开cmd窗口,进入MySql安装的bin目录2.执行命令登录数据库,之后会出现一行要你输入密码的mysql -u root -p3.执行以下命令分配新用户:grant all privileges on *.* to ‘用户名‘‘IP地址‘ identified by ‘密码‘;4.执行完上述命令后用下面的命令刷新…

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

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

mysql导出如何不区分大小写_mysql 不区分大小写

show variables like %case%-------------------------------| Variable_name | Value |-------------------------------| lower_case_file_system | OFF || lower_case_table_names | 1 | 表示已经是支持忽略大小写了-------------------------------修改 /etc/mysql/…

[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文档类型…

hdu2457 Trie图+dp

hdu2457 给定n个模式串, 和一个文本串 问如果修改最少的字符串使得文本串不包含模式串, 输出最少的次数,如果不能修改成功,则输出-1 dp[i][j] 表示长度为i的字符串, 到达状态j(Trie图中的结点)…

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

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

mysql 1449 : The user specified as a definer ('root'@'%') does not exist 解决方法

权限问题,授权 给 root 所有sql 权限 mysql> grant all privileges on *.* to root"%" identified by ".";Query OK, 0 rows affected (0.00 sec)mysql> flush privileges;Query OK, 0 rows affected (0.00 sec)转载于:https://www.cnbl…

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

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

openSUSE 11 上的配置可以Xmanager远程桌面

openSUSE 11 上的配置(适用于默认图形环境为KDE的Linux): 1、配置KDM。 openSUSE 11的默认图形环境为KDE,虽然可以同时安装GDM和KDM,但默认只启动了KDM。所以openSUSE 11只需配置KDM,如果你启动了GDM来代替KDM,则配置可…

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

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

图片的缩放(放大缩小)

package com.school.util;import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException;import javax.imageio.ImageIO; /*** * <b>类名称&#xff1a;图片处理工具类</b>ImageUtils…

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

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

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

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

mysql 交叉连接的用法_深入理解MySQL的外连接、内连接、交叉连接

1、内联接(典型的联接运算&#xff0c;使用像 或 <> 之类的比较运算符)。包括相等联接和自然联接。内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如&#xff0c;检索 students和courses表中学生标识号相同的所有行。2、外联接。外联接可以是左向外联…

基于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;平板计算机或笔记本计算机来编程…

mysql数据库设计规范_MYSQL数据库设计规范与原则

MYSQL数据库设计规范1、数据库命名规范采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线_组成;命名简洁明确(长度不能超过30个字符);例如&#xff1a;user, stat, log, 也可以wifi_user, wifi_stat, wifi_log给数据库加个前缀;除非是备份数据库可以加0-9的自然…

jar乱放问题

之前看到一个项目不能继承类SimpleTagSuppert类&#xff0c;而将jsp-api.jar&#xff08;不知道servlet-api.jar能不能放&#xff09;放入到了 jdk/jre/lib/ext包下面结果不仅正在写的jsp不能运行&#xff0c;以前的web应用也不能运行&#xff0c;会出现 java.lang.ClassNotFo…

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

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