实际上,线程和进程的区别,在学OS时必然是学习过的,所缺的不过是一些总结。

1. 进程

进程(process)是计算机中已运行程序的实体。在面向线程设计的系统中,进程本身不是基本运行单位,而是线程的容器。程序本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例。若干进程有可能与同一个程序相关系,且每个进程皆可以同步(循序)或异步(平行)的方式独立运行。现代计算机系统可在同一段时间内以进程的形式将多个程序加载到存储器中,并借由时间共享(或称时分复用),以在一个处理器上表现出同时(平行性)运行的感觉。同样的,使用多线程技术(多线程即每一个线程都代表一个进程内的一个独立执行上下文)的操作系统或计算机架构,同样程序的平行线程,可在多CPU主机或网络上真正同时运行(在不同的CPU上)。

2. 线程

线程(thread)是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。

3. 进程与线程

我们可以总结出以下几条区别:

  • 尺度:进程是线程的容器,线程是程序执行的最小单元。 一个程序至少有一个进程,一个进程至少有一个线程。线程的划分尺度小于进程。
  • 执行:进程往往有独立的运行入口,顺序执行序列,独立的运行出口。线程不能独立执行,必须依存于应用程序,由应用程序来进行线程控制。
  • 资源:进程和线程最主要的区别是他们是不同的操作系统资源管理方式。
    • 进程有独立的地址空间,一个进程在崩溃后,在保护模式下不会对其他进程产生影响。而线程只是一个进程中的不同执行路径,线程有自己独立的栈和局部变量,但线程之间没有独立的地址空间(参见Java基础:Java虚拟机(JVM)),一个线程死掉往往导致整个进程死掉,所以多进程程序要比多线程程序健壮,但在进程切换时,资源消耗较大,效率要差一些。
    • 对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

4. 多进程与多线程对比

  • 数据共享性:多进程共享依赖复杂的进程间通信;多线程数据共享因共享进程数据而十分简单。
  • 数据同步:多进程数据分开,同步简单;多线程数据同步复杂。
  • 资源消耗:多进程占用CPU,内存多;多线程占用CPU,内存小。
  • 创建销毁切换:多进程复杂;多线程简单。
  • 编程:多进程简单;多线程复杂。
  • 可靠性:多进程不进行进程间通信的话,进程间不会互相影响;多线程一个线程挂掉将导致整个进程挂掉。
  • 分布式:多进程适合多机分布式,扩展方便;多线程适合多核分布式。

5. Java多进程与多线程

5.1. Java多进程

我们常常去讲多线程开发,但是很少去讲多进程。

对于Java而言,所有的Java程序都是在JVM中运行,而在JVM内部,程序的运行是通过多线程实现的。每当用户启动一个Java应用程序,就启用了一个Java进程。

Java的多进程通信可以使用管道或者socket。

5.2. Java多线程

正如在文章JVM里讲过那样,Java的多线程是和操作系统的线程进行映射的。实际上Thread类的大部分api和Java其他api不同,其关键方法是native方法,换言之,Java的多线程的实现有赖于操作系统本身的多线程实现,操作系统的线程模型很大程度的决定了Java虚拟机的映射。

综上,Java本身运行在JVM虚拟机中,而Java的多进程通信又只能依赖于管道和socket,在绝大多情况下,应该考虑的是多线程而非多进程。

6. 参考文章

进程和线程的区别

JAVA多进程与多线程的概念

多线程还是多进程的选择及区别

​

Java多线程:线程与进程的更多相关文章

  1. Java多线程基础:进程和线程之由来

    转载: Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够 ...

  2. 1、Java多线程基础:进程和线程之由来

    Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通 ...

  3. Java多线程--线程及相关的Java API

    Java多线程--线程及相关的Java API 线程与进程 进程是线程的容器,程序是指令.数据的组织形式,进程是程序的实体. 一个进程中可以容纳若干个线程,线程是轻量级的进程,是程序执行的最小单位.我 ...

  4. Java多线程——线程之间的协作

    Java多线程——线程之间的协作 摘要:本文主要学习多线程之间是如何协作的,以及如何使用wait()方法与notify()/notifyAll()方法. 部分内容来自以下博客: https://www ...

  5. java 多线程—— 线程让步

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  6. java 多线程—— 线程等待与唤醒

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  7. Java多线程-线程的同步(同步方法)

    线程的同步是保证多线程安全访问竞争资源的一种手段.线程的同步是Java多线程编程的难点,往往开发者搞不清楚什么是竞争资源.什么时候需要考虑同步,怎么同步等等问题,当然,这些问题没有很明确的答案,但有些 ...

  8. Java多线程——线程的优先级和生命周期

    Java多线程——线程的优先级和生命周期 摘要:本文主要介绍了线程的优先级以及线程有哪些生命周期. 部分内容来自以下博客: https://www.cnblogs.com/sunddenly/p/41 ...

  9. Java多线程——线程的创建方式

    Java多线程——线程的创建方式 摘要:本文主要学习了线程的创建方式,线程的常用属性和方法,以及线程的几个基本状态. 部分内容来自以下博客: https://www.cnblogs.com/dolph ...

  10. Java多线程——线程的死锁

    Java多线程——线程的死锁 摘要:本文主要介绍了Java多线程中遇到的死锁问题. 部分内容来自以下博客: https://www.cnblogs.com/wy697495/p/9757982.htm ...

随机推荐

  1. mpi中程序在集群中的分发

    我们在开发mpi程序时,由于其是分布式程序,我们在单个节点上完成编码后,需要将代码拷贝到整个集群进行测试.集群之间的文件拷贝可以通过scp命令完成.但是scp命令是针对两个节点之间文件互传设计,为了将 ...

  2. python,os操作文件,文件路径(上一级目录)

    python获取文件上一级目录:取文件所在目录的上一级目录 os.path.abspath(os.path.join(os.path.dirname('settings.py'),os.path.pa ...

  3. android报错 Expected BEGIN_OBJECT but was STRING at line 1 column 39 path $

    我在使用retrofit和Gson配合时,出现了这个问题,疑惑中乱七八糟瞎搞了一个下午没有解决.期间怀疑Gson解析不能使用泛型(因为我的解析使用了泛型),后来又觉得可能是我的关键字正好是解析器的某个 ...

  4. OS X中app store正在下载的文件在哪里

    很多朋友遇到过app下载一半卡死的情况,点击停止和继续又会无限期等待中. 其实可以将还未下完的app删除来再次尝试下. 打开终端,输入以下命令: open $(getconf DARWIN_USER_ ...

  5. OpenCV 直线检测

    /*------------------------------------------------------------------------------------------*\ This ...

  6. Linux下进程通信方式(简要概述)

    http://blog.sina.com.cn/s/blog_65c209580100u0ee.html (1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先 ...

  7. Android Studio Gradle Configuration Errors总结

    初次看到这个错误,我从下手Error:Configuration with name 'default' not found.  只知道这是由于android的grad项目构建的时候出现的错误,但是具 ...

  8. MarioTCP:一个单机可日30亿的百万并发长连接服务器

    原文:http://blog.csdn.net/everlastinging/article/details/10894493 注:如果用此服务器做变长data的传输,请在业务处理函数中为input ...

  9. Markdown语法及编辑器

    宗旨 Markdown 的目标是实现「易读易写」. 可读性,无论如何,都是最重要的.一份使用 Markdown 格式撰写的文件应该可以直接以纯文本发布,并且看起来不会像是由许多标签或是格式指令所构成. ...

  10. leetcode之旅(10)-Roman to Integer

    题目描述: Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range fr ...