日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

多线程 调用多线程的方法 Runtime与ProcessBuilder

發布時間:2023/12/10 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多线程 调用多线程的方法 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。