java進程
❶ 用java來實現一個進程管理系統
構造方法摘要
ProcessBuilder(List<String> command)
利用指定的操作系統程序和參數構造一個進程生成器。
ProcessBuilder(String... command)
利用指定的操作系統程序和參數構造一個進程生成器。
方法摘要
List<String> command()
返回此進程生成器的操作系統程序和參數。
ProcessBuilder command(List<String> command)
設置此進程生成器的操作系統程序和參數。
ProcessBuilder command(String... command)
設置此進程生成器的操作系統程序和參數。
File directory()
返回此進程生成器的工作目錄。
ProcessBuilder directory(File directory)
設置此進程生成器的工作目錄。
Map<String,String> environment()
返回此進程生成器環境的字元串映射視圖。
boolean redirectErrorStream()
通知進程生成器是否合並標准錯誤和標准輸出。
ProcessBuilder redirectErrorStream(boolean redirectErrorStream)
設置此進程生成器的 redirectErrorStream 屬性。
Process start()
使用此進程生成器的屬性啟動一個新進程。
2.1.2 Runtime
每個 Java 應用程序都有一個 Runtime 類實例,使應用程序能夠與其運行的環境相連接。可以通過 getRuntime 方法獲取當前運行時。
應用程序不能創建自己的 Runtime 類實例。但可以通過 getRuntime 方法獲取當前Runtime運行時對象的引用。一旦得到了一個當前的Runtime對象的引用,就可以調用Runtime對象的方法去控制Java虛擬機的狀態和行為。
Java代碼
void addShutdownHook(Thread hook)
注冊新的虛擬機來關閉掛鉤。
int availableProcessors()
向 Java 虛擬機返回可用處理器的數目。
Process exec(String command)
在單獨的進程中執行指定的字元串命令。
Process exec(String[] cmdarray)
在單獨的進程中執行指定命令和變數。
Process exec(String[] cmdarray, String[] envp)
在指定環境的獨立進程中執行指定命令和變數。
Process exec(String[] cmdarray, String[] envp, File dir)
在指定環境和工作目錄的獨立進程中執行指定的命令和變數。
Process exec(String command, String[] envp)
在指定環境的單獨進程中執行指定的字元串命令。
Process exec(String command, String[] envp, File dir)
在有指定環境和工作目錄的獨立進程中執行指定的字元串命令。
void exit(int status)
通過啟動虛擬機的關閉序列,終止當前正在運行的 Java 虛擬機。
long freeMemory()
返回 Java 虛擬機中的空閑內存量。
void gc()
運行垃圾回收器。
InputStream getLocalizedInputStream(InputStream in)
已過時。 從 JDK 1.1 開始,將本地編碼位元組流轉換為 Unicode 字元流的首選方法是使用 InputStreamReader 和 BufferedReader 類。
OutputStream getLocalizedOutputStream(OutputStream out)
已過時。 從 JDK 1.1 開始,將 Unicode 字元流轉換為本地編碼位元組流的首選方法是使用 OutputStreamWriter、BufferedWriter 和 PrintWriter 類。
static Runtime getRuntime()
返回與當前 Java 應用程序相關的運行時對象。
void halt(int status)
強行終止目前正在運行的 Java 虛擬機。
void load(String filename)
載入作為動態庫的指定文件名。
void loadLibrary(String libname)
載入具有指定庫名的動態庫。
long maxMemory()
返回 Java 虛擬機試圖使用的最大內存量。
boolean removeShutdownHook(Thread hook)
取消注冊某個先前已注冊的虛擬機關閉掛鉤。
void runFinalization()
運行掛起 finalization 的所有對象的終止方法。
static void runFinalizersOnExit(boolean value)
已過時。 此方法本身具有不安全性。它可能對正在使用的對象調用終結方法,而其他線程正在操作這些對象,從而導致不正確的行為或死鎖。
long totalMemory()
返回 Java 虛擬機中的內存總量。
void traceInstructions(boolean on)
啟用/禁用指令跟蹤。
void traceMethodCalls(boolean on)
啟用/禁用方法調用跟蹤。
2.1.3 Process
不管通過那種方法啟動進程後,都會返回一個Process類的實例代表啟動的進程,該實例可用來控制進程並獲得相關信息。Process 類提供了執行從進程輸入、執行輸出到進程、等待進程完成、檢查進程的退出狀態以及銷毀(殺掉)進程的方法:
Java代碼
void destroy()
殺掉子進程。
一般情況下,該方法並不能殺掉已經啟動的進程,不用為好。
int exitValue()
返回子進程的出口值。
只有啟動的進程執行完成、或者由於異常退出後,exitValue()方法才會有正常的返回值,否則拋出異常。
InputStream getErrorStream()
獲取子進程的錯誤流。
如果錯誤輸出被重定向,則不能從該流中讀取錯誤輸出。
InputStream getInputStream()
獲取子進程的輸入流。
可以從該流中讀取進程的標准輸出。
OutputStream getOutputStream()
獲取子進程的輸出流。
寫入到該流中的數據作為進程的標准輸入。
int waitFor()
導致當前線程等待,如有必要,一直要等到由該 Process 對象表示的進程已經終止。
通過該類提供的方法,可以實現與啟動的進程之間通信,達到交互的目的。
2.2 實例
2.2.1 創建子進程
要創建子進程可以通過使用使用ProcessBuilder的start()方法和Runtime的exec()方法。
(1)Runtime.exec()
Java代碼
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
public class Test1 {
public static void main(String[] args) {
try {
Process p = null;
String line = null;
BufferedReader stdout = null;
//list the files and directorys under C:\
p = Runtime.getRuntime().exec("CMD.exe /C dir", null, new File("C:\\"));
stdout = new BufferedReader(new InputStreamReader(p
.getInputStream()));
while ((line = stdout.readLine()) != null) {
System.out.println(line);
}
stdout.close();
//echo the value of NAME
p = Runtime.getRuntime().exec("CMD.exe /C echo %NAME%", new String[] {"NAME=TEST"});
stdout = new BufferedReader(new InputStreamReader(p
.getInputStream()));
while ((line = stdout.readLine()) != null) {
System.out.println(line);
}
stdout.close();
} catch (Exception e) {
e.printStackTrace();
}
}
(2)ProcessBuilder
Java代碼
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class Test2 {
public static void main(String[] args) {
try {
List<String> list = new ArrayList<String>();
ProcessBuilder pb = null;
Process p = null;
String line = null;
BufferedReader stdout = null;
//list the files and directorys under C:\
list.add("CMD.EXE");
list.add("/C");
list.add("dir");
pb = new ProcessBuilder(list);
pb.directory(new File("C:\\"));
p = pb.start();
stdout = new BufferedReader(new InputStreamReader(p
.getInputStream()));
while ((line = stdout.readLine()) != null) {
System.out.println(line);
}
stdout.close();
//echo the value of NAME
pb = new ProcessBuilder();
pb.command(new String[] {"CMD.exe", "/C", "echo %NAME%"});
pb.environment().put("NAME", "TEST");
p = pb.start();
stdout = new BufferedReader(new InputStreamReader(p
.getInputStream()));
while ((line = stdout.readLine()) != null) {
System.out.println(line);
}
stdout.close();
} catch (Exception e) {
e.printStackTrace();
}
}
從啟動其他程序的Java進程看,已啟動的其他程序輸出就是一個普通的輸入流,可以通過getInputStream()和getErrorStream來獲取。對於一般輸出文本的進程來說,可以將InputStream封裝成BufferedReader,然後就可以一行一行的對進程的標准輸出進行處理。
通常,一個程序/進程在執行結束後會向操作系統返回一個整數值,0一般代表執行成功,非0表示執行出現問題。有兩種方式可以用來獲取進程的返回值。一是利用waitFor(),該方法是阻塞的,執導進程執行完成後再返回。該方法返回一個代表進程返回值的整數值。另一個方法是調用exitValue()方法,該方法是非阻塞的,調用立即返回。但是如果進程沒有執行完成,則拋出異常。
❷ java怎麼殺掉java進程
java中有調用外部程序的類,Runtime.getRuntime().exec("./**.exe");此函數返回的是一個Process 對象,該對象在創建後,可以對它進行 destroy () 殺掉子進程、 waitFor () 導致當前線程等待,如有必要,一直要等到由該 Process 對象表示的進程已經終止。 如下例子可以殺掉已經打開的文本進程:
importjava.io.BufferedReader;
importjava.io.InputStreamReader;
publicclassTest
{
publicstaticvoidmain(String[]args)
{
try
{
String[]cmd=
{"notepad.exe"};
Processproc=Runtime.getRuntime().exec(cmd);//開啟文本
BufferedReaderin=newBufferedReader(newInputStreamReader(proc
.getInputStream()));
Stringstring_Temp=in.readLine();
while(string_Temp!=null)
{
System.out.println(string_Temp);
if(string_Temp.indexOf("notepad.exe")!=-1)
Runtime.getRuntime().exec("Taskkill/IMnotepad.exe");
string_Temp=in.readLine();
}
}
catch(Exceptione)
{
//結束進程
}
}
結果如下:
❸ 如何修改java程序的進程名
可以在new 線程的時候指定線程名稱,如果後期還想修改,可以調用Thread的setName方法:
publicstaticvoidmain(String[]args)throwsInterruptedException{
Threadthread=newThread(newRunnable(){
@Override
publicvoidrun(){
System.out.println(Thread.currentThread().getName());
try{
Thread.sleep(1000);
//主線程中進行了修改
System.out.println(Thread.currentThread().getName());
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
},"這里設置線程名稱");
thread.start();
//500毫秒後修改線程名稱
Thread.sleep(500);
thread.setName("新的線程名稱!");
}
運行結果:
❹ Java進程怎麼實現
Java中多進程編程的實現,和多線程一樣,多進程同樣是實現並發的一種方式,需要的朋友可以參考下
1.Java進程的創建
Java提供了兩種方法用來啟動進程或其它程序:
(1)使用Runtime的exec()方法
(2)使用ProcessBuilder的start()方法
1.1 ProcessBuilder
ProcessBuilder類是J2SE 1.5在java.lang中新添加的一個新類,此類用於創建操作系統進程,它提供一種啟動和管理進程(也就是應用程序)的方法。在J2SE 1.5之前,都是由Process類處來實現進程的控制管理。
每個 ProcessBuilder 實例管理一個進程屬性集。start() 方法利用這些屬性創建一個新的 Process 實例。start() 方法可以從同一實例重復調用,以利用相同的或相關的屬性創建新的子進程。
每個進程生成器管理這些進程屬性:
命令 是一個字元串列表,它表示要調用的外部程序文件及其參數(如果有)。在此,表示有效的操作系統命令的字元串列表是依賴於系統的。例如,每一個總體變數,通常都要成為此列表中的元素,但有一些操作系統,希望程序能自己標記命令行字元串——在這種系統中,Java 實現可能需要命令確切地包含這兩個元素。
環境 是從變數 到值 的依賴於系統的映射。初始值是當前進程環境的一個副本(請參閱 System.getenv())。
工作目錄。默認值是當前進程的當前工作目錄,通常根據系統屬性 user.dir 來命名。
redirectErrorStream 屬性。最初,此屬性為 false,意思是子進程的標准輸出和錯誤輸出被發送給兩個獨立的流,這些流可以通過 Process.getInputStream() 和 Process.getErrorStream() 方法來訪問。如果將值設置為 true,標准錯誤將與標准輸出合並。這使得關聯錯誤消息和相應的輸出變得更容易。在此情況下,合並的數據可從 Process.getInputStream() 返回的流讀取,而從 Process.getErrorStream() 返回的流讀取將直接到達文件尾。
❺ java.exe 是什麼進程!
描述: java.exe是Sun Microsystems公司的相關網路協議軟體。通常基於Internet Explorer工作 在一般情況而言,它用到伺服器架設所需要一項組件。
❻ java如何啟動一個進程
這個問題有點糾結。。。當你運行 static void main()的,,就已經啟動進程了呀。不知道是不是這個意思。
❼ java調用進程
String command = "javac –cp . *.java";
//或String []command = {"javac", "–cp .", "*.java"};
Process process = Runtime.getRuntime().exec(command);
InputStream is = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line;
while ((line = br.readLine()) != null) {
System.out.println("javac>" + line);
}
//TODO is.close();
int ret = process.waitFor();
❽ java 什麼是進程
。。。。。。。。。。。
進程是, 操作系統級別的,分配內存的,任務單位
線程是,程序內部的,共享進程內存的,執行單位
進程是一個項目經理,線程是一堆程序員
項目經理從 老闆 那裡 拿到 資源和任務,然後各個程序員去干
❾ 如何用Java關閉一個進程
解決這個問題,要看這個進程是java程序自定義的進程,還是操作系統的進程,操作系統的進程,又可以分為windows進程和Linux進程
一、針對操作系統的進程:
1,首先java用戶,要具有操作進程的許可權
2. 針對windows操作系統的進程,比如QQ進程:
Stringcommand="taskkill/f/imQQ.exe";
Runtime.getRuntime().exec(command);
其中:taskkill 是命令名稱,/f /im 是參數,QQ.exe是進程的可執行文件。
3.針對Linux操作系統
Stringcommand="kill/f/imQQ.exe";
Runtime.getRuntime().exec(command);
二、在Java程序中自定義的進程
思路:在線程中設置一個標志變數,當這個變數的值在外界被改變的時候,有機會結束運行的線程
publicclassT{
publicstaticvoidmain(String[]args){
//啟動線程
MyThreadthread=newMyThread();
newThread(thread).start();
//你的其它的工作,此時線程在運行中
//你不想讓線程幹活了,停掉它
//注意,這只是一個標志,具體線程何時停,並不能精確控制
thread.allDone=true;
}
}
{
booleanvolatileallDone=false;
publicvoidrun(){
//每次循環都檢測標志
//如果設置停止標志時已經在循環里
//則最長需要等待一個循環的時間才能終止
while(!allDone){
//循環里的工作
}
}
}
❿ java查看進程
/**
* 查詢正在運行的系統進程信息
*
* @param processName
* //eclipse.exe
*/
public static String findProcessInfo(String processName) {
BufferedReader bufferedReader = null;
String isF = null;
try {
Process proc = Runtime.getRuntime().exec("tasklist");
bufferedReader = new BufferedReader(new InputStreamReader(proc.getInputStream(), "GB2312"));
String line = null;
while ((line = bufferedReader.readLine()) != null) {
System.err.println(line + " ");
if (line.contains(processName)) {
isF = line;
break;
}
}
proc.getOutputStream().close();
proc.getInputStream().close();
proc.destroy();
proc = null;
} catch (Exception ex) {
ex.printStackTrace();
}
if (bufferedReader != null) {
try {
bufferedReader.close();
bufferedReader = null;
} catch (Exception ex) {
}
}
return isF;
}
其實就是java調用cmd的命令行實現,這種功能可以應用到很多方面,就看你的熟悉的程度了。