一、线程、进程

线程,就是是进程的一个单位,程序最小执行单位。 进程,就是一个执行中的应用程序;由此可见,进程是由很多线程组成的;

线程生命周期,就是管杀也管埋的过程,生老病死;

线程的5个状态:

新建状态,可执行状态,执行状态,阻塞状态,死亡状态; 可以理解为生老病死:生:创建,老(成长过程):可执行,执行状态,病:阻塞,死:死亡状态; 个人的一点理解和记忆;以下借用别人的一张图来理解下:

大致过程,就是如此,新建线程后,就是一个对象,我们暂且叫他小三子,然后小三子去等待被叫,等到CPU说,小三子到你了,来开始,一声令下,她就开始跑了,正直青春期生命力顽强,你可以让她阻塞,也可能因为其他原因,被抢,开始生病阻塞,这时随时可能又被叫醒,如果加了锁或其他的,他可能会去加入队列等待被执行,等一系列,循环或等待后,执行了自己的任务完成后,这个线程也就等着老死了,一生结束;

二、并发和并行的一点理解

这里借用一个图,或许你一下子就理解了(本人也是这么理解的):Erlang 之父 Joe Armstrong 用一张5岁小孩都能看懂的图解释了并发与并行的区别

由上图可见:并发是两个或两个以上,同时交替使用一个咖啡机,一台咖啡机为多个人服务;并行是,两个咖啡机,同时为每个队伍服务;  重点看,是不是一个多多个主机cpu的服务;

以上,对线程,进程有个初步理解的理论基础知识,知道即可,在实际应用中,是理解部分的知识;

三、线程池的概念

线程使用过程中,创建,执行,销毁,都是消耗内存的,不能无休止的创建线程等等,这就需要我们来管理这些线程,那么管理这些线程我们就可以理解为我们暂且创建一个池子,池子中有我们的线程,这样我们就会来管理他,这种概念我们成为线程池;

Executor框架是java中的线程池实现,在java的API中我们可以看到下面的结构:


1、Executor是一个接口,其只定义了一个execute()方法:void execute(Runnable command);,只能提交Runnable形式的任务,不支持提交Callable带有返回值的任务。以下是java源码,看到作者了吗,不知道可以去查,jdk1.5开始;

2、 ExecutorService 继承了Executor ,在Executor的基础上加入了线程池的生命周期管理,进入源码我们可以看到,有shutdown或者shutdownNow方法来关闭我们的线程池。ExecutorService支持提交Callable形式的任务,提交完Callable任务后我们拿到一个Future,它代表一个异步任务执行的结果。关于shutdown和shutdownNow方法我们需要注意的是:这两个方法是非阻塞的,调用后立即返回,不会等待线程池关闭完成。如果我们需要等待线程池处理完成再返回可以使用ExecutorService#awaitTermination来完成。

shutdown方法会等待线程池中已经运行的任何和阻塞队列中等待执行的任务执行完成,而shutdownNow则不会,shutdownNow方法会尝试中断线程池中已经运行的任务,阻塞队列中等待的任务不会再被执行,阻塞队列中等待执行的任务会作为返回值返回。
 
要注意理解,有色字体部分;

 3、ThreadPoolExecutor:是线程池中最核心的类,我么创建线程池一般就是用它;当然这是java为我们提供的,另外一个常用的spring也为我们提供了一个 ThreadPoolTaskExecutor注意区分;

1、corePoolSize:线程池的核心线程数目,核心线程,只是在没有用的时候,也不会被回收;

2、maximumPoolSize就是线程池中可以容纳的最大线程的数量;

3、keepAliveTime 当大于corePoolSize 数量,小于maximumPoolSize 最大线程数,他就会起作用,核心线程即使在无任务的情况下也不能被清除,其余的都是有存活时间的,意思就是非核心线程可以保留的最长的空闲时间,workQueue,就是等待队列,任务可以储存在任务队列中等待被执行,执行的是FIFIO原则(先进先出)超过这个空闲时间空闲线程将被回收;

4、workQueue:阻塞队列,超过corePoolSize部分的请求放入这个阻塞队列中等待执行。阻塞队列分为有界阻塞队列和无界阻塞队列。在创建阻塞队列时如果我们指定了这个队列的“capacity”则这个队列就是有界的,否则是无界的。这里有一点需要注意:使用线程池之前请明确是否真的需要无界阻塞队列,如果阻塞队列是无界的,会导致大量的请求堆积,进而造成内存溢出系统崩溃。

 5、任务进来时,首先执行判断,判断核心线程是否处于空闲状态,如果不是,核心线程就先就执行任务,如果核心线程已满,则判断任务队列是否有地方存放该任务,若果有,就将任务保存在任务队列中,等待执行,如果满了,在判断最大可容纳的线程数,如果没有超出这个数量,就开创非核心线程执行任务,如果超出了,就调用handler实现拒绝策略。

6.拒绝策略:

有四种:第一种AbortPolicy:不执行新任务,直接抛出异常,提示线程池已满

第二种DisCardPolicy:不执行新任务,也不抛出异常

第三种DisCardOldSetPolicy:将消息队列中的第一个任务替换为当前新进来的任务执行

第四种CallerRunsPolicy:直接调用execute来执行当前任务

四种厂家线程池:

CachedThreadPool:可缓存的线程池,该线程池中没有核心线程,非核心线程的数量为Integer.max_value,就是无限大,当有需要时创建线程来执行任务,没有需要时回收线程,适用于耗时少,任务量大的情况。

SecudleThreadPool:周期性执行任务的线程池,按照某种特定的计划执行线程中的任务,有核心线程,但也有非核心线程,非核心线程的大小也为无限大。适用于执行周期性的任务。

SingleThreadPool:只有一条线程来执行任务,适用于有顺序的任务的应用场景。

FixedThreadPool:定长的线程池,有核心线程,核心线程的即为最大的线程数量,没有非核心线程

 

 

java 线程、进程及相关知识点 《笔记一》的更多相关文章

  1. Java 多线程与并发【知识点笔记】

    Java 多线程与并发[知识点笔记] Java多线程与并发 先说一下线程与进程的由来: 在初期的计算机,计算机只能串行执行任务,并且需要长时间的等待用户的输入才行 到了后来,出现了批处理,可以预先将用 ...

  2. java 线程 原子类相关操作演示样例 thinking in java4 文件夹21.3.4

    java 线程  原子类相关操作演示样例 package org.rui.thread.volatiles; import java.util.Timer; import java.util.Time ...

  3. 【Java基础】String 相关知识点总结

    String 相关知识点总结 字符串的不可变性 概述 String 被声明为 final,因此它不可继承 在 Java8 中,String 内部使用 char 数组存储数据 public final ...

  4. java中线程中的相关知识点

    (1)守护线程必须在线程start前设置(2)守护线程在所有用户线程结束后,也会终止(3)由于(2)所有守护线程不能执行一些读写操作,原因:如果守护线程在执行读写操作时,如果用户线程结束了,守护线程的 ...

  5. java中IO流相关知识点

    (一) 下边使用outputStream字节输出流进行写操作 package zdbIO;import java.io.File;import java.io.FileNotFoundExceptio ...

  6. java 继承extends 的相关知识点

    java只有单继承,不能多继承 子类只能继承父类的非私有成员(成员变量.成员方法) 子类不能继承父类的构造方法,但是可以通过super关键字访问父类的构造方法 继承 要体现子类父类的 继承关系, ”i ...

  7. Java线程和多线程(一)——线程的基本概念

    Java 线程是一个轻量级执行任务的处理单元.Java提供了Thread类来支持多线程,开发者在应用中可以创建多个线程来支持并发执行任务. 在应用中存在两种类型的线程,用户线程和守护线程.当我们启动应 ...

  8. java线程day-01

    综述:下面写的是我学习java线程时做的一些笔记和查阅的一些资料总结而成.大多以问答的形式出现. 一.什么是线程? 答:线程是一个轻量级的进程,现在操作系统中一个基本的调度单位,而且线程是彼此独立执行 ...

  9. Java线程状态转换

    前言:对于Java线程状态方面的知识点,笔者总感觉朦朦胧胧,趁着最近整理资料,将Java线程状态方面的知识点总结归纳,以便加深记忆. 1.Java线程状态值 在Thread类源码中通过枚举为线程定义了 ...

  10. Java线程和进程相关面试题与答案总结

    有几天没有写一写博客了,今天就带给大家一些面试题和参考答案吧! 这些都是上海尚学堂Java培训的学员去面试时遇到的问题,今天总结出来的是Java线程相关类的面试题.把参考答案和解析也发布出来,供大家学 ...

随机推荐

  1. Node.js 处理 File

    Node.js 处理 File fs 模块 常规使用 运用递归遍历目录树 创建文件和目录 读写文件 path 模块 对于 file 的理解,此处 fs 模块 Node.js 提供了处理文件系统的内置模 ...

  2. 顺序表_C

    // Code file created by C Code Develop #include "ccd.h" #include "stdio.h" #incl ...

  3. 用.Net实现GraphRag:从零开始构建智能知识图谱

    近来,大模型技术日新月异,使得与其相关的研发项目也层出不穷.其中一个备受关注的技术便是RAG(Retrieval Augmented Generation).今天,我要跟大家分享一个出色的项目:Gra ...

  4. java8interface的新特性:default,static,funcation

    default:默认方法 在类接口中可以直接定义的方法,实现接口的类可以直接使用 使用案例: public interface MyInterface { default void display() ...

  5. 【Linux】11 RPM & YUM 管理工具 介绍

    rpm包的管理 介绍: 一种用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中. 它生成具有.RPM扩展名的文件.RPM是RedHat Package Manager(RedHat软件包 ...

  6. PID入门视频课程分享: 单片机 > PID课程:一堂课帮你搞定PID算法 > pid算法

    推荐入门视频: <PID课程:一堂课帮你搞定PID算法> 收费版: http://t.elecfans.com/v/1399.html 免费版: 地址: https://www.bilib ...

  7. 基于Unity开发的强化学习环境(游戏环境):ml-agents —— Unity ML-Agents

    介绍: https://medium.com/nerd-for-tech/an-introduction-to-machine-learning-with-unity-ml-agents-af7193 ...

  8. NVIDIA显卡原生管理查询功能nvidia-smi的部分使用功能

    本文是使用NVIDIA原生管理工具查询NVIDIA显卡使用情况的一些记录(使用远程管理工具的效率没有使用原生管理接口nvml的效率高,有效率需求者建议使用python版本捆绑的nvml库,具体:htt ...

  9. union在重构代码中的使用技巧

    http://blog.chinaunix.net/uid-23629988-id-158156.html 在产品的开发过程中,无论是代码的重构,还是添加新的功能时,都不可避免的有对现有结构体的修改, ...

  10. GNU make-Makefile文件简介

    Makefile简介 Makefile是一种特殊格式的文件,被make工具使用来管理软件的构建过程.Makefile定义了一组规则和依赖关系,告诉make如何编译和链接程序. Makefile语句 T ...