A. 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() 返回的流讀取將直接到達文件尾。
B. 經驗分享:對Java中的線程感想(多線程)
1.進程和線程的區別
通俗一點說,進程就是程序的一次執行,而線程可以理解為進程中的執行凳局褲的一段程序片段。
用一臘搭點文詞說就是,每個進程都有獨立的代碼和數據空間(進程上下文);而線程可以看成是輕量級的進程。一般來講(不使用特殊技術),同一進程所產生的線程共享同一塊內存空間。
同一進程中的兩段代碼是不可能同時執行的,除非引入線程。
線程是屬於進程的,當進程退出時該進程所產生的線程都會被強制退出並清除。
線程佔用的資源要少於進程所佔用的資源。
進程和線程都可以有優先順序。
在線程系統中進程也是一個線程。可以將進程理解為一個程序的第一個線程。
多進程——在操作系統中,能同時運行多個任務(程序)。
多線程——在同一應用程序中,有多個順序流同時執行。
2.通過鐵路售票程序來理解實現多線程的兩種方法:通過java.lang.Thread類和通過Runnable介面
java中有兩種實現多線程的方式。一是直接繼承Thread類,二是實現Runnable介面。那麼這兩種實現多線程的方式在應用上有什麼區別呢?
為了回答這個問題,我們可以通過編寫一段代碼來進行分析。我們用代碼來模擬鐵路售票系統,實現通過四個售票點發售某日某次列車的100張車票,一個售票點用一個線程表示。
我們首先這樣編寫這個程序:
public class ThreadDome1{
public static void main(String[] args){
ThreadTest t = new ThreadTest();
t.start();
t.start();
t.start();
t.start();
}
}
class ThreadTest extends Thread{
private int ticket = 100;
public void run(){
while(true){
if(ticket > 0){
System.out.println(Thread.currentThread().getName() +
"is saling ticket" + ticket--);
}else{
break;
}
}
}
}
上面的代碼中,我們用ThreadTest類模擬售票處的售票過程,run方法中的每一次循環都將總票數減1,模擬賣出一張車票,同時該車票號列印出來,直接剩餘的票數到零為止。在ThreadDemo1類的main方法中,我們創建了一個線程對象,並重復啟動四次,希望通過這種方式產生四個線程。從運行的結果來看我們發現其實只有一個線程在運行,這個結果告訴我們:一個線程對象只能啟動一個線程,無論你調用多少遍start()方法,結果只有一個線程。
我們接著修棗簡改ThreadDemo1,在main方法中創建四個Thread對象:
public class ThreadDemo1{
public static void main(String[] args){
new ThreadTest().start();
new ThreadTest().start();
new ThreadTest().start();
new ThreadTest().start();
}
}
class ThreadTest extends Thread{
private int ticket = 100;
public void run(){
while(true){
if(ticket > 0){
System.out.println(Thread.currentThread().getName() +
" is saling ticket" + ticket--);
}else{
break;
}
}
}
}
這下達到目的了嗎?
從結果上看每個票號都被列印了四次,即四個線程各自賣各自的100張票,而不去賣共同的100張票。這種情況是怎麼造成的呢?我們需要的是,多個線程去處理同一個資源,一個資源只能對應一個對象,在上面的程序中,我們創建了四個ThreadTest對象,就等於創建了四個資源,每個資源都有100張票,每個線程都在獨自處理各自的資源。
經過這些實驗和分析,可以總結出,要實現這個鐵路售票程序,我們只能創建一個資源對象,但要創建多個線程去處理同一個資源對象,並且每個線程上所運行的是相同的程序代碼。在回顧一下使用介面編寫多線程的過程。
public class ThreadDemo1{
public static void main(String[] args){
ThreadTest t = new ThreadTest();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
}
}
class ThreadTest implements Runnable{
private int tickets = 100;
public void run(){
while(true){
if(tickets > 0){
System.out.println(Thread.currentThread().getName() +
" is saling ticket " + tickets--);
}
}
}
}
上面的程序中,創建了四個線程,每個線程調用的是同一個ThreadTest對象中的run()方法,訪問的是同一個對象中的變數(tickets)的實例,這個程序滿足了我們的需求。在Windows上可以啟動多個記事本程序一樣,也就是多個進程使用同一個記事本程序代碼。
可見,實現Runnable介面相對於繼承Thread類來說,有如下顯著的好處:
(1)適合多個相同程序代碼的線程去處理同一資源的情況,把虛擬CPU(線程)同程序的代碼,數據有效的分離,較好地體現了面向對象的設計思想。
(2)可以避免由於Java的單繼承特性帶來的局限。我們經常碰到這樣一種情況,即當我們要將已經繼承了某一個類的子類放入多線程中,由於一個類不能同時有兩個父類,所以不能用繼承Thread類的方式,那麼,這個類就只能採用實現Runnable介面的方式了。
(3)有利於程序的健壯性,代碼能夠被多個線程共享,代碼與數據是獨立的。當多個線程的執行代碼來自同一個類的實例時,即稱它們共享相同的代碼。多個線程操作相同的數據,與它們的代碼無關。當共享訪問相同的對象時,即它們共享相同的數據。當線程被構造時,需要的代碼和數據通過一個對象作為構造函數實參傳遞進去,這個對象就是一個實現了Runnable介面的類的實例。
C. linux 啟動一個java有多個java進程
啟動java後台進程有兩種方式: 1. 絕對路徑/bin/java() & : 後台運行,你關掉終端會停止運行 2. nohup 絕對路徑/bin/java (java程序) : 後台運行,你關掉終端也會繼續運行 java相關操作有: 1.查看java進程信息
D. 使用Java命令行運行同一個jar包兩次會產生兩個進程
產生沖突了。
Java是一門面向對象的編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特徵。Java語言作為靜態面向對象編程語言的代表,極好地實現了面向對象理論,允許程序員以優雅的思維方式進行復雜的編程。
Java具有簡單性、面向對象、分布式、健壯性、安全性、平台獨立與可移植性、多線程、動態性等特點[2]。Java可以編寫桌面應用程序、Web應用程序、分布式系統和嵌入式系統應用程序等。
E. linux 同時出現兩個java進程,新手~ 請詳細說明,這個是什麼原因。 我就裝了一個jdk
首先Tomcat是用java開發的,所以它的開始和停止的命令都是用java來執行的。
你執行一下ps -ef |grep tomcat如果輸出:
sun 5144 1 0 10:21 pts/1 00:00:06 /java/jdk/bin/java -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/java/tomcat/common/endorsed -classpath :/java/tomcat/bin/bootstrap.jar:/java/tomcat/bin/commons-logging-api.jar -Dcatalina.base=/java/tomcat -Dcatalina.home=/java/tomcat -Djava.io.tmpdir=/java/tomcat/temp org.apache.catalina.startup.Bootstrap start
說明tomcat已經正常啟動
但是你下面又出現了一個stop進程,說明你用自帶的Tomcat停止包來執行了Tomcat停止的命令,所以創建了這個進程。但是這個命令在你這個版本有BUG,所以並沒有結束掉。
這時候你要停止Tomcat,直接kill這個start進程就行了。
另外,JDK不是一個軟體,它是一個環境,並不是你裝了JDK就會開啟一個java進程。系統裡面有幾個java進程取決於依賴這個環境的軟體開啟的進程個數。