介绍Java中关于进程与线程的相关封装类

本文主要介绍 Java 中关于进程与线程的相关封装类,揭示如何创建 Java 进程与线程,Java 封装类和实际的系统本地进程和线程是如何对应的,以及使用 Java 进程和线程的一些限制。

进程与线程,本质意义上说, 是操作系统的调度单位,可以看成是一种操作系统 “资源” 。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 [] cmd
array) 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

表 1. JDK 中 native 方法与 Windows API 的对应关系

JDK 中调用的 native 方法名 对应调用的 Windows API create CreateProcess,CreatePipe close CloseHandle waitfor WaitForMultipleObjects destroy TerminateProcess exitValue GetExitCodeProcess

时间: 2024-10-17 23:29:59

介绍Java中关于进程与线程的相关封装类的相关文章

Java中的进程与线程的实现

概述 进程与线程,本质意义上说, 是操作系统的调度单位,可以看成是一种操作系统 "资源" .Java 作为与 平台无关的编程语言,必然会对底层(操作系统)提供的功能进行进一步的封装,以平台无关的编程接口供程序员使用,进 程与线程作为操作系统核心概念的一部分无疑亦是如此.在 Java 语言中,对进程和线程的封装,分别提供了 Process 和 Thread 相关的一些类.本文首先简单的介绍如何使用这些类来创建进程和线程,然后着重介绍这些类是如何和操作系统本 地进程线程相对应的,给出了 J

Android中的进程和线程

进程和线程是现代网络操作系统的核心概念.Android作为一种优秀的.承袭Linux的移动操作系统,其进程和线程的概念是开发者和安全工作人员需要深入了解的问题.本文将详细介绍Android中的进程.线程以及相关的技术问题. 进程和线程的基本概念 当一个应用程序开始运行它的第一个组件时,Android会为它启动一个Linux进程,并在其中执行一个单一的线程.默认情况下,应用程序所有的组件均在这个进程的这个线程中运行.然而,你也可以安排组件在其他进程中运行,而且可以为任意进程衍生出其它线程. And

java线程-java中的多线程?线程的并发问题

问题描述 java中的多线程?线程的并发问题 多线程具体代表java中程序的什么?它指的实际功能上的什么情况?详细求解 解决方案 多线程和进程的关系详解: 1.当我们运行QQ程序时,操作系统就会为这个程序创建一个QQ进程(QQ~PCB)并且分配CPU.内存等资源. 2.但这个进程中包含着:发送大型的线程.接受文件的线程.发送文字信息的线程.发送文字信息的线程等多个不同功能的线程. 因而我们才能一边发送文件,一边发送文字信息同时操作.这些线程都共享着QQ进程中的CPU.内存等资源. 总结:所以说进

java中关于启动一个线程的问题

问题描述 java中关于启动一个线程的问题 start( )方法是不是只能用于启动可以线程,还有什么其他方面的用法吗 解决方案 start仅仅是运行线程的run方法而已 解决方案二: 你的意思是..想问start()这个方法在其他地方有没有同名的方法?还是想问,还有没有其他方法能启动线程? 解决方案三: java新建一个线程 解决方案四: Thread的start方法就是启动线程的,但是别的类的这个方法是什么作用就不一定了.

Java中如何使一个线程进入阻塞态?

问题描述 按我的理解,当一个线程需要获取的锁被另一个线程占用时,将进入阻塞态.但实际好像不是这样的,下面是我的代码.在run方法中会调用MyBlock的isBlocked方法,该方法添加了synchronized限定.在main方法中创建两个线程:t1和t2,t1运行后,由于isBlocked方法运行需要一定时间,t2应该进入阻塞态.但我调用getState方法得到的是Runnable,不是Blocked.这是为啥呢? public class TestThread implements Run

基于java中stack与heap的区别,java中的垃圾回收机制的相关介绍_java

#. 在java中有两类内存.分别称为stack(堆栈)和heap(堆). stack是程序内存空间,因此所有的基本类型和对象的引用是存在stack中. heap是java虚拟机储存对象的,它是一个巨大的内存,当你创造一个对象,java虚拟机把对象放入heap中,把创造的对象的地址放入stack中. 因此,基本类型.对象的引用储存在stack中:对象储存在heap中. #. java中的垃圾回收机制 当你new一个新的对象,java分配必需的内存.当你用完一个对象时,java的垃圾回收器为你把内

Java中利用管道实现线程间的通讯

在Java 语言中,提供了各种各样的输入输出流(stream),使我们能够很方便的对数据进行操作,其中,管道(pipe)流是一种特殊的流,用于在不同线程(threads)间直接传送数据.一个线程发送数据到输出管道,另一个线程从输入管道中读数据.通过使用管道,实现不同线程间的通讯.无需求助于类似临时文件之类的东西.本文在简要介绍管道的基本概念后,将以一个具体的实例pipeapp加以详细说明. 1.管道的创建与使用 Java提供了两个特殊的专门的类专门用于处理管道,它们就是pipedinputstr

java中获取另一个线程中的信息

在进行多线程编程中,比较重要也是比较困难的一个操作就是如何获取线程中的信息.大多数人会采取比较常见的一种方法就是将线程中要返回的结果存储在一个字段中,然后再提供一个获取方法将这个字段的内容返回给该方法的调用者.如以下的ReturnThreadInfo类: package threadtest1; public class ReturnThreadInfo extends Thread { private String str; public ReturnThreadInfo() { this.s

Java中for、while、do while三种循环语句的区别介绍_java

本文通过实例讲解给大家介绍Java中for.while.do while三种循环语句的区别,具体详情如下所示: 第一种:for循环 循环结构for语句的格式: for(初始化表达式;条件表达式;循环后的操作表达式) { 循环体; } eg: class Dome_For2{ public static void main(String[] args) { //System.out.println("Hello World!"); //求1-10的偶数的和 int sum = 0; fo