我之见--java进程,线程

第一 :什么是进程?

  进程是操作系统结构的基础;是一个正在执行的程序;计算机中正在运行的程序实例;可以分配给处理器并由处理器执行的一个实体;由单一顺序的执行显示,一个当前状态和一组相关的系统资源所描述的活动单元;因此进程有以下特点:
  第一,进程是一个实体,具有封装性,和 隔离性。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量;每个进程都是封装的,进程只能访问自己的数据,一般情况下不能跨进程访问;隔离进程之间的相互影响。
  第 二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程;因此我们可以说进程是处理器高度的基本单位。

第二:进程特征:

    动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。 
    并发性;独立性;异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进 
    结构特征:进程由程序、数据和进程控制块三部分组成。 

第三:什么是线程

  现代操作把轻量级的进程定义为线程,线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。线程总是属于某个进程,进程中的多个线程共享进程的内存。而在java中,线程是jvm调度的基本单位,也是jvm主要部分。

第四:进程的创建:

  在java中创建进程有两种方法:
(1)使用Runtime的exec()方法 
(2)使用ProcessBuilder的start()方法 
  1.   每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。可以通过 getRuntime 方法获取当前运行时。 
      应用程序不能创建自己的 Runtime 类实例。但可以通过 getRuntime 方法获取当前Runtime运行时对象的引用。一旦得到了一个当前的Runtime对象的引用,就可以调用Runtime对象的方法去控制Java虚拟机的状态和行为。 
  2. API预览
       
    </pre><pre name="code" class="html">API预览
        addShutdownHook(Thread hook) 
          注册新的虚拟机来关闭挂钩。 
        availableProcessors() 
          向 Java 虚拟机返回可用处理器的数目。 
        exec(String command) 
          在单独的进程中执行指定的字符串命令。 
        exec(String[] cmdarray) 
          在单独的进程中执行指定命令和变量。 
        exec(String[] cmdarray, String[] envp) 
          在指定环境的独立进程中执行指定命令和变量。 
        exec(String[] cmdarray, String[] envp, File dir) 
          在指定环境和工作目录的独立进程中执行指定的命令和变量。 
        exec(String command, String[] envp) 
          在指定环境的单独进程中执行指定的字符串命令。 
        exec(String command, String[] envp, File dir) 
          在有指定环境和工作目录的独立进程中执行指定的字符串命令。 
        exit(int status) 
          通过启动虚拟机的关闭序列,终止当前正在运行的 Java 虚拟机。 
        freeMemory() 
          返回 Java 虚拟机中的空闲内存量。 
        gc() 
          运行垃圾回收器。 
        InputStream getLocalizedInputStream(InputStream in) 
          已过时。 从 JDK 1.1 开始,将本地编码字节流转换为 Unicode 字符流的首选方法是使用 InputStreamReader 和 BufferedReader 类。 
        OutputStream getLocalizedOutputStream(OutputStream out) 
          已过时。 从 JDK 1.1 开始,将 Unicode 字符流转换为本地编码字节流的首选方法是使用 OutputStreamWriter、BufferedWriter 和 PrintWriter 类。 
        getRuntime() 
          返回与当前 Java 应用程序相关的运行时对象。 
        halt(int status) 
          强行终止目前正在运行的 Java 虚拟机。 
        load(String filename) 
          加载作为动态库的指定文件名。 
        loadLibrary(String libname) 
          加载具有指定库名的动态库。 
        maxMemory() 
          返回 Java 虚拟机试图使用的最大内存量。 
        removeShutdownHook(Thread hook) 
          取消注册某个先前已注册的虚拟机关闭挂钩。 
        runFinalization() 
          运行挂起 finalization 的所有对象的终止方法。 
        runFinalizersOnExit(value) 
          已过时。 此方法本身具有不安全性。它可能对正在使用的对象调用终结方法,而其他线程正在操作这些对象,从而导致不正确的行为或死锁。 
        totalMemory() 
          返回 Java 虚拟机中的内存总量。 
        traceInstructions(on) 
          启用/禁用指令跟踪。 
        traceMethodCalls(on) 
          启用/禁用方法调用跟踪。


  3. 利用Runtime创建进程代码:
    class ExecDemo { 
            public static void main(String args[]){ 
                    Runtime r = Runtime.getRuntime(); 
                    Process p = null; 
                    try{ 
                            p = r.exec("notepad"); 
                    } catch (Exception e) { 
                            System.out.println("Error executing notepad."); 
                    } 
            } 
    }

  4. Process Api预览:
    void destroy()   
              杀掉子进程。  
             一般情况下,该方法并不能杀掉已经启动的进程,不用为好。  
    int exitValue()   
              返回子进程的出口值。   
              只有启动的进程执行完成、或者由于异常退出后,exitValue()方法才会有正常的返回值,否则抛出异常。  
    InputStream getErrorStream()   
              获取子进程的错误流。  
             如果错误输出被重定向,则不能从该流中读取错误输出。  
    InputStream getInputStream()   
              获取子进程的输入流。  
              可以从该流中读取进程的标准输出。  
    OutputStream getOutputStream()   
              获取子进程的输出流。  
              写入到该流中的数据作为进程的标准输入。  
    int waitFor()   
              导致当前线程等待,如有必要,一直要等到由该 Process 对象表示的进程已经终止
    因此我们可以
    getInputStream对进程进行输出。可以获得进程的相关信息和执行的输出结果。
  5. 利用ProcessBuilde 创建进程: ProcessBuilder类是J2SE 1.5在java.lang中新添加的一个新类,此类用于创建操作系统进程,它提供一种启动和管理进程(也就是应用程序)的方法。在J2SE 1.5之前,都是由Process类处来实现进程的控制管理。
          每个 ProcessBuilder 实例管理一个进程属性集。它的start() 方法利用这些属性创建一个新的 Process 实例。start() 方法可以从同一实例重复调用,以利用相同的或相关的属性创建新的子进程。 (我在《深入研究java.lang.Runtime类》中讲过,进程也可以由Runtime.exec()启动。) 利用ProcessBuilder很容易创建: Process p = new ProcessBuilder("myCommand", "myArg").start();
     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值