一、进程与应用程序的区别      进程(Process)是最初定义在Unix等多用户、多任务操作系统环境下用于表示应用程序在内存环境中基本执行单元的概念。以Unix操作系统为例,进程是Unix操作系统环境中的基本成分、是系统资源分配的基本单位。Unix操作系统中完成的几乎所有用户管理和资源分配等工作都是通过操作系统对应用程序进程的控制来实现的。      C、C++、Java等语言编写的源程序经相应的编译器编译成可执行文件后,提交给计算机处理器运行。这时,处在可执行状态中的应用程序称为进程。从用户角度来看,进程是应用程序的一个执行过程。从操作系统核心角度来看,进程代表的是操作系统分配的内存、CPU时间片等资源的基本单位,是为正在运行的程序提供的运行环境。进程与应用程序的区别在于应用程序作为一个静态文件存储在计算机系统的硬盘等存储空间中,而进程则是处于动态条件下由操作系统维护的系统资源管理实体。多任务环境下应用程序进程的主要特点包括:      ●进程在执行过程中有内存单元的初始入口点,并且进程存活过程中始终拥有独立的内存地址空间;      ●进程的生存期状态包括创建、就绪、运行、阻塞和死亡等类型;      ●从应用程序进程在执行过程中向CPU发出的运行指令形式不同,可以将进程的状态分为用户态和核心态。处于用户态下的进程执行的是应用程序指令、处于核心态下的应用程序进程执行的是操作系统指令。      在Unix操作系统启动过程中,系统自动创建swapper、init等系统进程,用于管理内存资源以及对用户进程进行调度等。在Unix环境下无论是由操作系统创建的进程还要由应用程序执行创建的进程,均拥有唯一的进程标识(PID)。 二、进程与Java线程的区别         应用程序在执行过程中存在一个内存空间的初始入口点地址、一个程序执行过程中的代码执行序列以及用于标识进程结束的内存出口点地址,在进程执行过程中的每一时间点均有唯一的处理器指令与内存单元地址相对应。      Java语言中定义的线程(Thread)同样包括一个内存入口点地址、一个出口点地址以及能够顺序执行的代码序列。但是进程与线程的重要区别在于线程不能够单独执行,它必须运行在处于活动状态的应用程序进程中,因此可以定义线程是程序内部的具有并发性的顺序代码流。      Unix操作系统和Microsoft Windows操作系统支持多用户、多进程的并发执行,而Java语言支持应用程序进程内部的多个执行线程的并发执行。多线程的意义在于一个应用程序的多个逻辑单元可以并发地执行。但是多线程并不意味着多个用户进程在执行,操作系统也不把每个线程作为独立的进程来分配独立的系统资源。进程可以创建其子进程,子进程与父进程拥有不同的可执行代码和数据内存空间。而在用于代表应用程序的进程中多个线程共享数据内存空间,但保持每个线程拥有独立的执行堆栈和程序执行上下文(Context)。      基于上述区别,线程也可以称为轻型进程 (Light Weight Process,LWP)。不同线程间允许任务协作和数据交换,使得在计算机系统资源消耗等方面非常廉价。      线程需要操作系统的支持,不是所有类型的计算机都支持多线程应用程序。Java程序设计语言将线程支持与语言运行环境结合在一起,提供了多任务并发执行的能力。这就好比一个人在处理家务的过程中,将衣服放到洗衣机中自动洗涤后将大米放在电饭锅里,然后开始做菜。等菜做好了,饭熟了同时衣服也洗好了。      需要注意的是:在应用程序中使用多线程不会增加 CPU 的数据处理能力。只有在多CPU 的计算机或者在网络计算体系结构下,将Java程序划分为多个并发执行线程后,同时启动多个线程运行,使不同的线程运行在基于不同处理器的Java虚拟机中,才能提高应用程序的执行效率。 另外,如果应用程序必须等待网络连接或数据库连接等数据吞吐速度相对较慢的资源时,多线程应用程序是非常有利的。基于Internet的应用程序有必要是多线程类型的,例如,当开发要支持大量客户机的服务器端应用程序时,可以将应用程序创建成多线程形式来响应客户端的连接请求,使每个连接用户独占一个客户端连接线程。这样,用户感觉服务器只为连接用户自己服务,从而缩短了服务器的客户端响应时间。       三、Java语言的多线程程序设计方法         利用Java语言实现多线程应用程序的方法很简单。根据多线程应用程序继承或实现对象的不同可以采用两种方式:一种是应用程序的并发运行对象直接继承Java的线程类Thread;另外一种方式是定义并发执行对象实现Runnable接口。      继承Thread类的多线程程序设计方法      Thread 类是JDK中定义的用于控制线程对象的类,在该类中封装了用于进行线程控制的方法。见下面的示例代码:      复制代码 
  • 2009-7-9 18:36
  • 回复
  • zhutou8033
  • 0位粉丝

2楼

//Consumer.java   import java.util.*;   class Consumer extends Thread   {    int nTime;    String strConsumer;    public Consumer(int nTime, String strConsumer)    {    this.nTime = nTime;    this.strConsumer = strConsumer;    }    public void run()    {   while(true)   {    try   {    System.out.println("Consumer name:"+strConsumer+"\n");    Thread.sleep(nTime);    }   catch(Exception e)   {    e.printStackTrace();    }   }    }   static public void main(String args[])   {    Consumer aConsumer = new Consumer (1000, "aConsumer");    aConsumer.start();    Consumer bConsumer = new Consumer (2000, "bConsumer");    bConsumer.start();    Consumer cConsumer = new Consumer (3000, "cConsumer ");    cConsumer.start();   }   }  
  
              从上面的程序代码可以看出:多线程执行地下Consumer继承Java语言中的线程类Thread并且在main方法中创建了三个Consumer对象的实例。当调用对象实例的start方法时,自动调用Consumer类中定义的run方法启动对象线程运行。线程运行的结果是每间隔nTime时间打印出对象实例中的字符串成员变量strConsumer的内容。      可以总结出继承Thread类的多线程程序设计方法是使应用程序类继承Thread类并且在该类的run方法中实现并发性处理过程。      实现Runnable接口的多线程程序设计方法      Java语言中提供的另外一种实现多线程应用程序的方法是多线程对象实现Runnable接口并且在该类中定义用于启动线程的run方法。这种定义方式的好处在于多线程应用对象可以继承其它对象而不是必须继承Thread类,从而能够增加类定义的逻辑性。      实现Runnable接口的多线程应用程序框架代码如下所示:      //Consumer.java   import java.util.*;   class Consumer implements Runnable   {    … …   public Consumer(int nTime, String strConsumer){… …}   public void run(){… …}   static public void main(String args[])   {   Thread aConsumer = new Thread(new Consumer(1000, "aConsumer"));   aConsumer.start();   //其它对象实例的运行线程    //… …    }   }      从上述代码可以看出:该类实现了Runnable接口并且在该类中定义了run方法。这种多线程应用程序的实现方式与继承Thread类的多线程应用程序的重要区别在于启动多线程对象的方法设计方法不同。在上述代码中,通过创建Thread对象实例并且将应用对象作为创建Thread类实例的参数。 四、线程间的同步      Java应用程序的多个线程共享同一进程的数据资源,多个用户线程在并发运行过程中可能同时访问具有敏感性的内容。在Java中定义了线程同步的概念,实现对共享资源的一致性维护。下面以笔者最近开发的移动通信计费系统中线程间同步控制方法,说明Java语言中多线程同步方式的实现过程。      在没有多线程同步控制策略条件下的客户账户类定义框架代码如下所示:      public class RegisterAccount   {   float fBalance;   //客户缴费方法   public void deposit(float fFees){ fBalance += fFees; }   //通话计费方法   public void withdraw(float fFees){ fBalance -= fFees; }   … …   }               读者也许会认为:上述程序代码完全能够满足计费系统实际的需要。确实,在单线程环境下该程序确实是可靠的。但是,多进程并发运行的情况是怎样的呢?假设发生这种情况:客户在客户服务中心进行缴费的同时正在利用移动通信设备仅此通话,客户通话结束时计费系统启动计费进程,而同时服务中心的工作人员也提交缴费进程运行。

  • 2009-7-9 18:36
  • 回复
  • zhutou8033
  • 0位粉丝

3楼

读者可以看到如果发生这种情况,对客户账户的处理是不严肃的。      如何解决这种问题呢?很简单,在RegisterAccount类方法定义中加上用于标识同步方法的关键字synchronized。这样,在同步方法执行过程中该方法涉及的共享资源(在上述代码中为fBalance成员变量)将被加上共享锁,以确保在方法运行期间只有该方法能够对共享资源进行访问,直到该方法的线程运行结束打开共享锁,其它线程才能够访问这些共享资源。在共享锁没有打开的时候其它访问共享资源的线程处于阻塞状态。      进行线程同步策略控制后的RegisterAccount类定义如下面代码所示:      public class RegisterAccount   {   float fBalance;   public synchronized void deposit(float fFees){ fBalance += fFees; }   public synchronized void withdraw(float fFees){ fBalance -= fFees; }   … …   }      从经过线程同步机制定义后的代码形式可以看出:在对共享资源进行访问的方法访问属性关键字(public)后附加同步定义关键字synchronized,使得同步方法在对共享资源访问的时候,为这些敏感资源附加共享锁来控制方法执行期间的资源独占性,实现了应用系统数据资源的一致性管理和维护。 五、 Java线程的管理         线程的状态控制      在这里需要明确的是:无论采用继承Thread类还是实现Runnable接口来实现应用程序的多线程能力,都需要在该类中定义用于完成实际功能的run方法,这个run方法称为线程体(Thread Body)。按照线程体在计算机系统内存中的状态不同,可以将线程分为创建、就绪、运行、睡眠、挂起和死亡等类型。这些线程状态类型下线程的特征为:      创建状态:当利用new关键字创建线程对象实例后,它仅仅作为一个对象实例存在,JVM没有为其分配CPU时间片等线程运行资源;      就绪状态:在处于创建状态的线程中调用start方法将线程的状态转换为就绪状态。这时,线程已经得到除CPU时间之外的其它系统资源,只等JVM的线程调度器按照线程的优先级对该线程进行调度,从而使该线程拥有能够获得CPU时间片的机会。      睡眠状态:在线程运行过程中可以调用sleep方法并在方法参数中指定线程的睡眠时间将线程状态转换为睡眠状态。这时,该线程在不释放占用资源的情况下停止运行指定的睡眠时间。时间到达后,线程重新由JVM线程调度器进行调度和管理。      挂起状态:可以通过调用suspend方法将线程的状态转换为挂起状态。这时,线程将释放占用的所有资源,由JVM调度转入临时存储空间,直至应用程序调用resume方法恢复线程运行。      死亡状态:当线程体运行结束或者调用线程对象的stop方法后线程将终止运行,由JVM收回线程占用的资源。      在Java线程类中分别定义了相应的方法,用于在应用程序中对线程状态进行控制和管理。      线程的调度      线程调用的意义在于JVM应对运行的多个线程进行系统级的协调,以避免多个线程争用有限资源而导致应用系统死机或者崩溃。      为了线程对于操作系统和用户的重要性区分开,Java定义了线程的优先级策略。Java将线程的优先级分为10个等级,分别用1-10之间的数字表示。数字越大表明线程的级别越高。相应地,在Thread类中定义了表示线程最低、最高和普通优先级的成员变量MIN_PRIORITY、MAX_PRIORITY和NORMAL_PRIORITY,代表的优先级等级分别为1、10和5。当一个线程对象被创建时,其默认的线程优先级是5。      为了控制线程的运行策略,Java定义了线程调度器来监控系统中处于就绪状态的所有线程。线程调度器按照线程的优先级决定那个线程投入处理器运行。在多个线程处于就绪状态的条件下,具有高优先级的线程会在低优先级线程之前得到执行。线程调度器同样采用"抢占式"策略来调度线程执行,即当前线程执行过程中有较高优先级的线程进入就绪状态,则高优先级的线程立即被调度执行。具有相同优先级的所有线程采用轮转的方式来共同分配CPU时间片。      在应用程序中设置线程优先级的方法很简单,在创建线程对象之后可以调用线程对象的setPriority方法改变该线程的运行优先级,同样可以调用getPriority方法获取当前线程的优先级。      在Java中比较特殊的线程是被称为守护(Daemon)线程的低级别线程。这个线程具有最低的优先级,用于为系统中的其它对象和线程提供服务。将一个用户线程设置为守护线程的方式是在线程对象创建之前调用线程对象的setDaemon方法。典型的守护线程例子是JVM中的系统资源自动回收线程,它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。      线程分组管理      Java定义了在多线程运行系统中的线程组(ThreadGroup)对象,用于实现按照特定功能对线程进行集中式分组管理。

进程与应用程序的区别相关推荐

  1. 进程和应用程序的区别(简单理解)

    进程和应用程序的区别(简单理解) [什么是进程]   官方解释:进程是一个具有独立功能的程序关于某个数据集合的一次运行活动.它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体.它不只是程序的 ...

  2. linux进程和程序的却别,操作系统:进程的概念和与程序的区别

    进程的概念和与程序的区别 1.进程的定义 进程是允许某个并发执行的程序在某个数据集合上的运行过程. 进程是由正文段.用户数据段及进程控制块共同组成的执行环境.正文段存放被执行的机器指令,用户数据段存放 ...

  3. 程序、进程、线程之间的区别

    1.   .net的公共语言运行时(CLR)能够区别两种不同类型的线程:前台线程和后台线程.前台线程与后台线程的区别: 应用程序必须运行完所有的前台线程才可以退出.而对于后台线程,应用程序则可以不考虑 ...

  4. 线程知识点(一)—— 程序、进程、线程之间的区别与联系、Java的线程状态和生命周期

    1 程序.进程.线程之间的区别与联系 三者之间的形象化理解: * 程序:代码实现了功能,就是程序,是静态的: * 进程:执行中的程序就是进程,是动态的: * 线程:进程内的一个执行单元,也是进程内的可 ...

  5. 2.1 linux C 进程与多线程入门--(1)进程和程序的区别

    进程和程序的区别: j进程是活动的程序,而程序是一个代码的集合.进程是加载到内存中的程序,而程序没有加载到内存中,只是在磁盘上存储着. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

  6. 进程与程序的区别与联系

    进程的定义 进程是允许某个并发执行的程序在某个数据集合上的运行过程. 进程是由正文段.用户数据段及进程控制块共同组成的执行环境. 正文段存放被执行的机器指令. 用户数据段存放进程在执行时直接进行操作的 ...

  7. 进程、线程、程序的区别

    一.程序.进程.线程的概念 程序:一组计算机能识别和执行的指令.它是一些保存在磁盘上的指令的有序集合 进程:进程是一个独立的可调度的任务,进程是一个抽象的实体,当系统在执行某个程序时,分配和释放的各种 ...

  8. 28.进程和程序的区别

    1.进程是动态的,程序是静态的. 2.进程是程序执行的一个过程,包括进程创建.进程运行.进程挂起.进程结束.程序是数据+代码.

  9. 进程与程序的区别和联系

    1)进程是程序及其数据在计算机的一次运行活动,是一个运行过程,是一个动态的概念.进程的运行实体是程序,离开程序的进程没有存在的意义.而程序是一组有序的指令集合,是一种静态概念. 2)进程是程序的一次执 ...

最新文章

  1. Attention Model(注意力模型)思想初探
  2. 查找数组中第K个最小值
  3. EOS 智能合约源代码解读 (11)wrap合约“action_wrapper类”
  4. Linux 5.4 LVM RAW 设备 配置的深入研究
  5. matlab --- 图像处理基础
  6. SAP License:孔乙己,一名ERP顾问
  7. 算法--帕斯卡三角(杨辉三角)JS写法
  8. LINUX mysql 源码安装
  9. JS判断字串字节数,并截取长度
  10. ASP.NET和ASP程序防止在IE中进行缓存
  11. 容器技术Docker K8s 39 Serverless Kubernetes(ASK)详解-阿里云Serverless容器(ASK)适用场景与核心功能
  12. win10下能够用的键盘映射工具? win10 下按键像mac一样
  13. 入职与离职手续、五险一金、档案
  14. 北京科技大学计算机实践,北京科技大学计算机实践报告-Excel 练习
  15. java经典算法(三)---zws
  16. python惰性求值例子_惰性求值和yield-Python
  17. 由浅入深!大牛耗时一年最佳总结,让你的app体验更丝滑!3面直接拿到offer
  18. 3D打印成型技术:看得见摸得着的真实
  19. View被遮挡的解决办法
  20. 技术交流微信群欢迎小伙伴前来交流

热门文章

  1. border-radius 构建规则讲解 及 50% 和 100% 的异同
  2. sqlite数据库使用
  3. 关于HOOK,如何通过钩子截获指定窗口的所有消息
  4. android 关机消息广播,Android开机、关机播音监听
  5. python打印运行log
  6. HTML5+CSS3小实例:后台管理系统的侧边导航栏
  7. 如何为雷电模拟器安装Burpsuite证书并抓包
  8. Go语言和php个和lua,当 Go 遇上了 Lua
  9. MySQL复制表结构,表数据。
  10. 一些语音特征--学习笔记