Java進程通信

  1. 管道(Pipe):管道可用於具備親緣關係進程間的通訊,容許一個進程和另外一個與它有共同祖先的進程之間進行通訊。
    建立子進程Java有兩種方式
    //第一種
    Runtime rt = Runtime.getRuntime(); 
    Process process = rt.exec("java -jar app2.jar"); 
    //第二種
    ProcessBuilder pb = new ProcessBuilder("java", "-jar","app2.jar"); 
    Process p = pb.start(); 
    第二種方式操做更方便,實例以下。
    父進程App.class
    try{
    	ProcessBuilder pb=new ProcessBuilder("java -jar app2.jar".split(" "));
    	pb.directory(new File("e:/temp/clean_day/jar/"));
    	//標準錯誤和輸入流合併爲輸入流
    	pb.redirectErrorStream(true);
    	//建立子進程
    	Process p=pb.start();
    	
    	//使用Process的輸入流接收子進程發送的消息
    	BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));
    	//使用Process的輸出流向子進程發送消息,並把PrintWriter設置爲自動flush.
    	PrintWriter wr=new PrintWriter(new OutputStreamWriter(p.getOutputStream()),true);
    	String lineStr;
    	while((lineStr=br.readLine())!=null){
    		System.out.println("收到子進程的消息:"+lineStr);
    		//向子進程發送消息
    		wr.println(System.currentTimeMillis());
    	}
    	wr.close();
    	br.close();
    }catch(Exception ex){
    	System.out.println(ex.getMessage());
    }
    子進程App2.class
    try{
    	System.out.println("子進程啓動成功");
    	System.out.println(System.currentTimeMillis());
    	
    	//利用標準輸入來接收父進程發送的消息
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	String lineStr;
    	while ((lineStr = br.readLine()) != null) {
    		System.out.println("child\t"+lineStr);	
    	}
    	br.close();
    }catch(Exception ex){
    	System.out.println(ex.getMessage());
    }
  2. (非進程,而是線程)PipedInputStream、PipedOutStream、PipedReader、PipedWriter管道流
    public class App {
    
    	public static void main(String[] args) {
    		PpWriter wr=new PpWriter();
    		PpReader rd=new PpReader(wr);
    
    		Thread wrth=new Thread(wr);
    		wrth.start();
    		
    		Thread rdth=new Thread(rd);
    		rdth.start();
    	}
    }
    
    /**
     * 管道寫
     * App.java:Temp
     * 2015年3月26日
     * @author kevin.zhai(韓旭)
     */
    class PpWriter implements Runnable{
    	private PipedWriter pipedWriter;
    	
    	public PpWriter(){
    		this.pipedWriter=new PipedWriter();
    	}
    	
    	@Override
    	public void run() {
    		try {
    			while(true){
    				//由於讀使用了readline,所以這裏要換行
    				String sendStr=System.currentTimeMillis()+"\r\n";
    				this.pipedWriter.write(sendStr);
    				System.out.println("父發送:"+sendStr);
    				Thread.sleep(1000);
    			}
    		} catch (IOException | InterruptedException e) {
    			e.printStackTrace();
    		}
    	}
    
    	public PipedWriter getPipedWriter() {
    		return pipedWriter;
    	}
    }
    
    /**
     * 管道讀
     * App.java:Temp
     * 2015年3月26日
     * @author kevin.zhai(韓旭)
     */
    class PpReader implements Runnable{
    	private PipedReader pipedReader;
    	
    	public PpReader(PpWriter ppWriter){
    		try {
    			//讀須要先和寫創建鏈接,不然報異常:Pipe not connected
    			this.pipedReader=new PipedReader(ppWriter.getPipedWriter());
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    	@Override
    	public void run() {
    		
    		try(BufferedReader br=new BufferedReader(this.pipedReader)){
    			while(true){
    				System.out.println("子接收:"+br.readLine());
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    }
相關文章
相關標籤/搜索