Java中的進程與線程的實現

來源:互聯網
上載者:User

概述

進程與線程,本質意義上說, 是作業系統的調度單位,可以看成是一種作業系統 “資源” 。Java 作為與 平台無關的程式設計語言,必然會對底層(作業系統)提供的功能進行進一步的封裝,以平台無關的編程介面供程式員使用,進 程與線程作為作業系統核心概念的一部分無疑亦是如此。在 Java 語言中,對進程和線程的封裝,分別提供了 Process 和 Thread 相關的一些類。本文首先簡單的介紹如何使用這些類來建立進程和線程,然後著重介紹這些類是如何和作業系統本 地進程線程相對應的,給出了 JAVA 虛擬機器對於這些封裝類的概要性的實現;同時由於 Java 的封裝也隱藏了底層的一些概 念和可操作性,本文還對 Java 進程線程和本地進程線程做了一些簡單的比較,列出了使用 Java 進程、線程的一些限制和 需要注意的問題。

Java 進程的建立方法

在 JDK 中,與進程有直接關係的類為 Java.lang.Process,它是一 個抽象類別。在 JDK 中也提供了一個實現該抽象類別的 ProcessImpl 類,如果使用者建立了一個進程,那麼肯定會伴隨著一個新 的 ProcessImpl 執行個體。同時和進程建立密切相關的還有 ProcessBuilder,它是在 JDK1.5 中才開始出現的,相對於 Process 類來說,提供了便捷的配置建立進程的環境,目錄以及是否合并錯誤流和輸出資料流的方式。

Java.lang.Runtime.exec 方法和 Java.lang.ProcessBuilder.start 方法都可以建立一個本地的進程,然後返回代 表這個進程的 Java.lang.Process 引用。

Runtime.exec 方法建立一個本地進程

該方法在 JDK1.5 中,可以 接受 6 種不同形式的參數傳入。

Process exec(String command)
Process exec(String [] cmdarray)
Process exec(String [] cmdarrag, String [] envp)
Process exec(String [] cmdarrag, String [] envp, File dir)
Process exec(String cmd, String [] envp)
Process exec(String command, String [] envp, File dir)

他們主要的不同在於傳入命令參數的形式,提供的環境變數以及定義執行目錄。

ProcessBuilder.start 方法來建立一個本地的進程

如果希望在新建立的進程中使用當前的目錄和環境變數 ,則不需要任何配置,直接將命令列和參數傳入 ProcessBuilder 中,然後調用 start 方法,就可以獲得進程的引用。

Process p = new ProcessBuilder("command", "param").start();

也可以先配置 環境變數和工作目錄,然後建立進程。

ProcessBuilder pb = new ProcessBuilder("command", "param1", "param2");
Map<String, String> env = pb.environment();
env.put("VAR", "Value");
pb.directory("Dir");
Process p = pb.start();

可以預先配置 ProcessBuilder 的屬性是通過 ProcessBuilder 建立進程的最大優點。而且可以在後 面的使用中隨著需要去改變代碼中 pb 變數的屬性。如果後續代碼修改了其屬性,那麼會影響到修改後用 start 方法建立 的進程,對修改之前建立的進程執行個體沒有影響。

JVM 對進程的實現

在 JDK 的代碼中,只提供了 ProcessImpl 類來實現 Process 抽象類別。其中引用了 native 的 create, close, waitfor, destory 和 exitValue 方法 。在 Java 中,native 方法是依賴於作業系統平台的本地方法,它的實現是用 C/C++ 等類似的底層語言實現。我們可以在 JVM 的原始碼中找到對應的本地方法,然後對其進行分析。JVM 對進程的實現相對比較簡單,以 Windows 下的 JVM 為例。 在 JVM 中,將 Java 中調用方法時的傳入的參數傳遞給作業系統對應的方法來實現相應的功能。如表 1

JDK 中調用的 native 方法名 對應調用的 Windows API
create CreateProcess,CreatePipe
close CloseHandle
waitfor WaitForMultipleObjects
destroy TerminateProcess
exitValue GetExitCodeProcess

以 create 方法為例,我們看一下它是如何和系統 API 進行串連的 。

在 ProcessImple 類中,存在 native 的 create 方法,其參數如下:

private native long create (String cmdstr, String envblock,
String dir, boolean redirectErrorStream, FileDescriptor in_fd,
FileDescriptor out_fd, FileDescriptor err_fd) throws IOException;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.