线程与进程的联系与区别(简单易懂)

一、什么是进程

进程就是正在运行中的程序,例如打开一个软件或文件,它就是一个正在运行的进程。

程序运行时系统就会创建一个进程,并为它分配资源(一块独立的内存空间),然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。

所以,进程的内存空间是独立的,进程是资源(CPU、内存等)分配的基本单位。

二、 什么是线程

一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。

线程是一条执行路径,是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位。

线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。

2021-11-14 17:31

Java并发编程

java_线程

进程与线程的区别

线程的状态

NEW:初始状态,线程被构建,但是还没有调用start()方法 RUNNABLE:运行状态,Java线程将操作系统中的就绪和运行两种状态统称为“运行状态” BLOCK:阻塞状态,表示线程阻塞于锁 WAITING:等待状态,进入该状态表示当前线程需要等待其他线程做出一些特定动作(通知或者等待) TIME_WAITING:超时等待状态,可以在等待的时间自行返回的 TERMINATED:终止状态,表示当前线程已经执行完毕

  • NEW:初始状态

    NEW:初始状态,线程被构建,但是还没有调用start()方法

  • RUNNABLE:运行状态

    RUNNABLE:运行状态,Java线程将操作系统中的就绪和运行两种状态统称为“运行状态”

  • BLOCK:阻塞状态

    BLOCK:阻塞状态,表示线程阻塞于锁

  • WAITING:等待状态

    WAITING:等待状态,进入该状态表示当前线程需要等待其他线程做出一些特定动作(通知或者等待)

  • TIME_WAITING:超时等待状态

    TIME_WAITING:超时等待状态,可以在等待的时间自行返回的

  • TERMINATED:终止状态

    TERMINATED:终止状态,表示当前线程已经执行完毕

  • Java线程状态切换

    Java并发核心知识

    并发编程需要解决的两大问题

  • 线程之间如何通信
  • 线程通信机制
  • 内存共享
  • 消息传递
  • 线程之间如何同步

    同步是指程序中用于控制不同线间操作发生相对顺序的机制

  • Java内存模型(JMM)

  • 重排序

    为了程序的性能,处理器、编译器都会对程序进行重排序处理

  • 顺序一致性

  • happens-before

  • as-if-serial

    所有的操作均可以为了优化而被重排序,但是你必须要保证重排序后执行的结果不能被改变

  • volatile

    synchronized

    队列同步器AQS

    CAS

    Compare And Swap,整个JUC体系最核心、最基础理论

    ThreadLocal

    ThreadLocal 不是用于解决共享变量的问题的,也不是为了协调线程同步而存在,而是为了方便每个线程处理自己的状态而引入的一个机制。

    为每一个线程创建一个单独的变量副本,从而每个线程都可以独立地改变自己所拥有的变量副本,而不会影响其他线程所对应的副本

  • ThreadLocalMap
  • _java_并发容器(集合)

    ConcurrentHashMap

    CAS + Synchronized 来保证并发更新的安全,底层采用数组+链表/红黑树的存储结构

    ConcurrentLinkedQueue

    基于链接节点的无边界的线程安全队列,采用FIFO原则对元素进行排序,内部采用CAS算法实现

    ConcurrentSkipListMap

    ConcurrentSkipListSet

    java_锁

    Lock接口

    ReentrantLock(重入锁)

    _ReentrantReadWriteLock(读写锁)

    LockSupport

    Condition接口

    Java阻塞队列

    阻塞队列类(7个)

  • ArrayBlockingQueue

    一个由数组组成的有界阻塞队列

  • LinkedBlockingQueue

    一个由链表组成的有界阻塞队列

  • _LinkedBlockingDeque

    一个由链表组成的双向阻塞队列

  • PriorityBlockingQueue

    一个支持优先级排序的无界阻塞队列

  • DelayQueue

    一个使用优先级队列实现的无界阻塞队列

  • SynchronousQueue

    一个不存储元素的阻塞队列

  • LinkedTransferQueue

    一个由链表组成的无界阻塞队列

    即可以像其他的BlockingQueue一样有容量又可以像SynchronousQueue一样不会锁住整个队列

  • java_并发工具

    CountDownLatch

    CyclicBarrier

    Semaphore

    Exchanger

    java_原子操作类Atomic

    基本类型类

    用于通过原子的方式更新基本类型

  • AtomicBoolean
  • AtomicInteger
  • AtomicLong
  • 数组

    通过原子的方式更新数组里的某个元素

  • AtomicIntegerArray

    原子更新整型数组里的元素

  • AtomicLongArray

    原子更新长整型数组里的元素

  • AtomicReferenceArray

    原子更新引用类型数组里的元素

  • 引用

    如果要原子的更新多个变量,就需要使用这个原子更新引用类型提供的类

  • AtomicReference

    原子更新引用类型

  • AtomicReferenceFieldUpdater

    原子更新引用类型里的字段

  • AtomicMarkableReference

    原子更新带有标记位的引用类型

  • 属性

    如果我们只需要某个类里的某个字段,那么就需要使用原子更新字段类

  • AtomicIntegerFieldUpdater

    原子更新整型的字段的更新器

  • AtomicLongFieldUpdater

    原子更新长整型字段的更新器

  • AtomicStampedReference

    原子更新带有版本号的引用类型

  • java并发框架

    Fork/Join框架

    一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架

    Executor框架

  • Executors

    静态工厂类,提供了Executor、ExecutorService、ScheduledExecutorService、ThreadFactory 、Callable 等类的静态工厂方法

  • ThreadPoolExecutor(线程池)

  • 线程池分类
  • FixedThreadPool
  • CachedThreadPool
  • SingleThreadExecutor
  • ScheduledThreadPoolExecutor

    继承自ThreadPoolExecutor,给定的延迟之后运行任务,或者定期执行任务

  • Future

    定义了取消任务,查询任务是否完成,获取任务的执行结果

  • FutureTask

    实现RunnableFuture接口,既可以作为Runnable被执行,也可以作为Future得到Callable的返回值。内部基于AQS实现

  • 相关教程

    更多

    关于线程的问题

    在学习多线程的时候,有一个问题总会困扰着我--  关于sleep方法.当调用此方法时当前线程会在此sleep时间段内让出  执行权,自己处于阻塞状态.  问题是当多个线程并发执行时,都会调用该方法,都会休眠相同的时间,感觉就是  每个线程只是停留了一下,并不能体会到sleep方法的作用?  不知道大家是怎么理解这个问题的,求解!

    关于线程

    线程,学了挺久了。我发现我不会写总结这种东西。 好吧,我又词穷了。不知道该怎么写了。先打开eclipse看看。先说说我对线程的理解把。 我觉得线程就是好几条流水线在一起工作,能提高工作效率和空间利用率。就像一个工厂,如果只用一条流水线,那每天生产的鞋子估计少得可怜,利润应该也不怎么样,这样的工厂应该关门了。但是如果一个工厂有好多条流水线,同时生产好多鞋子,那就可以挣好多钱,可以在这个行业有很强的竞

    多线程问题

    请教各位。本人在尝试写一个银行调度系统。但是多线程上遇到问题。目前有三个并发线程,但是同时只能运行两个线程,这是何解?!!!  代码如下:  public class Number  {  private long number = 0;  private long max = 0;  private String type = null;  public Number()  {  }  publ

    action 线程问题。

    比如现在有个Action,叫CZaction,有很多用户会访问这个action,这个action有对数据库操作,用线程Thread.sleep(1000);睡眠一秒才返回给用户。  我有这些疑问:1.如果很多用户访问这个action,睡眠线程会不会导致返回的action混乱?就是本来是返回给a的却返回给b了?  2.如果不用mapping.findForward()到其他页面,用response.

    一个简单的问题

    今天老师布置了一个作业:  用JSP页面 做出一个计算器功能 要求: 第一个计算数字 用文本框输入 计算符号 用下拉菜单显示 第二个计算数字用文本框内输入 答案就打印在下面 希望大家帮我好好想想

    启动Storm各个后台进程

    启动Storm的所有后台进程。和Zookeeper一样,Storm也是快速失败(fail-fast)的系统,这样Storm才能在 任意时刻被停止,并且当进程重启后被正确地恢复执行。这也是为什么Storm不在进程内保存状态的原因,即使Nimbus或Supervisors被重 启,运行中的Topologies不会受到影响。 以下是启动Storm各个后台进程的方式: Nimbus: 在Storm主控节点

    Java 多线程编程

    Java 多线程编程     Java给多线程编程提供了内置的支持。一个多线程程序包含两个或多个能并发运行的部分。程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径。 多线程是多任务的一种特别的形式。多线程比多任务需要更小的开销。 这里定义和线程相关的另一个术语:进程:一个

    jQuery中$与$()的区别?

    jQuery中$与$()的区别?

    一步一步掌握java的线程机制(一)----创建线程

    现在将1年前写的有关线程的文章再重新看了一遍,发现过去的自己还是照本宣科,毕竟是刚学java的人,就想将java的精髓之一---线程进制掌握到手,还是有点难度。等到自己已经是编程一年级生了,还是无法将线程这个高级的概念完全贯通,所以,现在趁着自己还在校,尽量的掌握多点有关线程机制的知识。 我们以一个简单的例子开始下手:      public class SwingTypeTester exten

    NoSuchMethodException和NoSuchMethodError的区别

    各位帮忙说说这两者的区别。我先简单说说,就当抛砖引玉了。  NoSuchMethodException继承自Exception  NoSuchMethodError继承自Error 一般有兼容性问题时会抛出该异常     问题补充:     Wind_ZhongGang 写道      就好像Exception和Error的区别一样,Exception作为异常可以不导致系统中止,而Error作为错

    android进程管理视频教程

    订阅     分享     安卓项目实战之金山手机卫士进程管理1          课程介绍: 手机开启软件太多总是卡卡滴有木有?!什么是进程管理?黑马高级讲师告诉你:进程管理是一款轻量级的手机管理软件.管理手机进程,让你的手机运行速度更快更稳!本次课程一共三天,同学们都要坚持下来哦...            开课时间:2015年07月01日20点      (已有61人学习)

    java线程状态详解(6种)

    java线程类为:java.lang.Thread,其实现java.lang.Runnable接口。 线程在运行过程中有6种状态,分别如下: NEW:初始状态,线程被构建,但是还没有调用start()方法 RUNNABLE:运行状态,Java线程将操作系统中的就绪和运行两种状态统称为“运行状态” BLOCK:阻塞状态,表示线程阻塞

    Hadoop下远程调试Child子进程

    在网上想找Hadoop远程调试Child子进程的文章,但是都没有见到具体步骤是如何操作的,对于初学者来说,要想真正理解MapReduce的shuffle的过程,对Child子进程的调试是必不可少的一项任务,至少对我来说是这样。费了九牛二虎之力,最后终于调试成功,在这里写下经验,分享给后面的hadoop学习爱好者。 我的环境:hadoop-0.20.2 Ubuntu 11.04 在eclipse下安

    请教多线程JAVA问题

    需求:  命令队列(存放n个命令,ip 端口 命令ID等信息),通过多线程scoket(线程数是20个).从命令队列里面取出 命令,解析执行。  连接的服务器,连接数是有限制的最大2个连接。所以scoket 必须维持长连接  最多可以有20个线程 连接20个不同IP的机器。但机器是N个。  问题1 怎么在多线程中维持长连接发送 接收数据,相同IP的命令发送接收完后需要断开连接。     问题补充:

    关于Hadoop中5个主要的守护进程的作用

    一般如果正常启动Hadoop,我们可以在master上通过jps命令看到以下5个daemons: [root@master ~]# jps 19803 SecondaryNameNode 19994 TaskTracker 31144 Jps 19571 NameNode 19672 DataNode 19887 JobTracker 下面依次介绍这些进程: 1. NameNode 它是Hadoo

    最新教程

    更多

    java线程状态详解(6种)

    java线程类为:java.lang.Thread,其实现java.lang.Runnable接口。 线程在运行过程中有6种状态,分别如下: NEW:初始状态,线程被构建,但是还没有调用start()方法 RUNNABLE:运行状态,Java线程将操作系统中的就绪和运行两种状态统称为“运行状态” BLOCK:阻塞状态,表示线程阻塞

    redis从库只读设置-redis集群管理

    默认情况下redis数据库充当slave角色时是只读的不能进行写操作,如果写入,会提示以下错误:READONLY You can't write against a read only slave.  127.0.0.1:6382> set k3 111  (error) READONLY You can't write against a read only slave. 如果你要开启从库

    Netty环境配置

    netty是一个java事件驱动的网络通信框架,也就是一个jar包,只要在项目里引用即可。

    Netty基于流的传输处理

    ​在TCP/IP的基于流的传输中,接收的数据被存储到套接字接收缓冲器中。不幸的是,基于流的传输的缓冲器不是分组的队列,而是字节的队列。 这意味着,即使将两个消息作为两个独立的数据包发送,操作系统也不会将它们视为两个消息,而只是一组字节(有点悲剧)。 因此,不能保证读的是您在远程定入的行数据

    Netty入门实例-使用POJO代替ByteBuf

    使用TIME协议的客户端和服务器示例,让它们使用POJO来代替原来的ByteBuf。

    Netty入门实例-时间服务器

    Netty中服务器和客户端之间最大的和唯一的区别是使用了不同的Bootstrap和Channel实现

    Netty入门实例-编写服务器端程序

    channelRead()处理程序方法实现如下

    Netty开发环境配置

    最新版本的Netty 4.x和JDK 1.6及更高版本

    电商平台数据库设计

    电商平台数据库表设计:商品分类表、商品信息表、品牌表、商品属性表、商品属性扩展表、规格表、规格扩展表

    HttpClient 上传文件

    我们使用MultipartEntityBuilder创建一个HttpEntity。 当创建构建器时,添加一个二进制体 - 包含将要上传的文件以及一个文本正文。 接下来,使用RequestBuilder创建一个HTTP请求,并分配先前创建的HttpEntity。

    MongoDB常用命令

    查看当前使用的数据库    > db    test  切换数据库   > use foobar    switched to db foobar  插入文档    > post={"title":"领悟书生","content":"这是一个分享教程的网站","date":new

    快速了解MongoDB【基本概念与体系结构】

    什么是MongoDB MongoDB is a general purpose, document-based, distributed database built for modern application developers and for the cloud era. MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

    windows系统安装MongoDB

    安装 下载MongoDB的安装包:mongodb-win32-x86_64-2008plus-ssl-3.2.10-signed.msi,按照提示步骤安装即可。 安装完成后,软件会安装在C:\Program Files\MongoDB 目录中 我们要启动的服务程序就是C:\Program Files\MongoDB\Server\3.2\bin目录下的mongod.exe,为了方便我们每次启动,我

    Spring boot整合MyBatis-Plus 之二:增删改查

    基于上一篇springboot整合MyBatis-Plus之后,实现简单的增删改查 创建实体类 添加表注解TableName和主键注解TableId import com.baomidou.mybatisplus.annotations.TableId;
    import com.baomidou.mybatisplus.annotations.TableName;
    import com.baom

    分布式ID生成器【snowflake雪花算法】

    基于snowflake雪花算法分布式ID生成器 snowflake雪花算法分布式ID生成器几大特点: 41bit的时间戳可以支持该算法使用到2082年 10bit的工作机器id可以支持1024台机器 序列号支持1毫秒产生4096个自增序列id 整体上按照时间自增排序 整个分布式系统内不会产生ID碰撞 每秒能够产生26万ID左右 Twitter的 Snowflake分布式ID生成器的JAVA实现方案