java 线程、进程及相关知识点 《笔记一》
一、线程、进程
线程,就是是进程的一个单位,程序最小执行单位。 进程,就是一个执行中的应用程序;由此可见,进程是由很多线程组成的;
线程生命周期,就是管杀也管埋的过程,生老病死;
线程的5个状态:
新建状态,可执行状态,执行状态,阻塞状态,死亡状态; 可以理解为生老病死:生:创建,老(成长过程):可执行,执行状态,病:阻塞,死:死亡状态; 个人的一点理解和记忆;以下借用别人的一张图来理解下:
大致过程,就是如此,新建线程后,就是一个对象,我们暂且叫他小三子,然后小三子去等待被叫,等到CPU说,小三子到你了,来开始,一声令下,她就开始跑了,正直青春期生命力顽强,你可以让她阻塞,也可能因为其他原因,被抢,开始生病阻塞,这时随时可能又被叫醒,如果加了锁或其他的,他可能会去加入队列等待被执行,等一系列,循环或等待后,执行了自己的任务完成后,这个线程也就等着老死了,一生结束;
二、并发和并行的一点理解
这里借用一个图,或许你一下子就理解了(本人也是这么理解的):Erlang 之父 Joe Armstrong 用一张5岁小孩都能看懂的图解释了并发与并行的区别
由上图可见:并发是两个或两个以上,同时交替使用一个咖啡机,一台咖啡机为多个人服务;并行是,两个咖啡机,同时为每个队伍服务; 重点看,是不是一个多多个主机cpu的服务;
以上,对线程,进程有个初步理解的理论基础知识,知道即可,在实际应用中,是理解部分的知识;
三、线程池的概念
线程使用过程中,创建,执行,销毁,都是消耗内存的,不能无休止的创建线程等等,这就需要我们来管理这些线程,那么管理这些线程我们就可以理解为我们暂且创建一个池子,池子中有我们的线程,这样我们就会来管理他,这种概念我们成为线程池;
Executor框架是java中的线程池实现,在java的API中我们可以看到下面的结构:
void execute(Runnable command);
,只能提交Runnable形式的任务,不支持提交Callable带有返回值的任务。以下是java源码,看到作者了吗,不知道可以去查,jdk1.5开始;2、 ExecutorService 继承了Executor ,在Executor的基础上加入了线程池的生命周期管理,进入源码我们可以看到,有shutdown或者shutdownNow方法来关闭我们的线程池。ExecutorService支持提交Callable形式的任务,提交完Callable任务后我们拿到一个Future,它代表一个异步任务执行的结果。关于shutdown和shutdownNow方法我们需要注意的是:这两个方法是非阻塞的,调用后立即返回,不会等待线程池关闭完成。如果我们需要等待线程池处理完成再返回可以使用ExecutorService#awaitTermination来完成。
3、ThreadPoolExecutor:是线程池中最核心的类,我么创建线程池一般就是用它;当然这是java为我们提供的,另外一个常用的spring也为我们提供了一个 ThreadPoolTaskExecutor注意区分;
1、corePoolSize:线程池的核心线程数目,核心线程,只是在没有用的时候,也不会被回收;
2、maximumPoolSize就是线程池中可以容纳的最大线程的数量;
3、keepAliveTime 当大于corePoolSize 数量,小于maximumPoolSize 最大线程数,他就会起作用,核心线程即使在无任务的情况下也不能被清除,其余的都是有存活时间的,意思就是非核心线程可以保留的最长的空闲时间,workQueue,就是等待队列,任务可以储存在任务队列中等待被执行,执行的是FIFIO原则(先进先出)超过这个空闲时间空闲线程将被回收;
5、任务进来时,首先执行判断,判断核心线程是否处于空闲状态,如果不是,核心线程就先就执行任务,如果核心线程已满,则判断任务队列是否有地方存放该任务,若果有,就将任务保存在任务队列中,等待执行,如果满了,在判断最大可容纳的线程数,如果没有超出这个数量,就开创非核心线程执行任务,如果超出了,就调用handler实现拒绝策略。
6.拒绝策略:
有四种:第一种AbortPolicy:不执行新任务,直接抛出异常,提示线程池已满
第二种DisCardPolicy:不执行新任务,也不抛出异常
第三种DisCardOldSetPolicy:将消息队列中的第一个任务替换为当前新进来的任务执行
第四种CallerRunsPolicy:直接调用execute来执行当前任务
四种厂家线程池:
CachedThreadPool:可缓存的线程池,该线程池中没有核心线程,非核心线程的数量为Integer.max_value,就是无限大,当有需要时创建线程来执行任务,没有需要时回收线程,适用于耗时少,任务量大的情况。
SecudleThreadPool:周期性执行任务的线程池,按照某种特定的计划执行线程中的任务,有核心线程,但也有非核心线程,非核心线程的大小也为无限大。适用于执行周期性的任务。
SingleThreadPool:只有一条线程来执行任务,适用于有顺序的任务的应用场景。
FixedThreadPool:定长的线程池,有核心线程,核心线程的即为最大的线程数量,没有非核心线程
java 线程、进程及相关知识点 《笔记一》的更多相关文章
- Java 多线程与并发【知识点笔记】
Java 多线程与并发[知识点笔记] Java多线程与并发 先说一下线程与进程的由来: 在初期的计算机,计算机只能串行执行任务,并且需要长时间的等待用户的输入才行 到了后来,出现了批处理,可以预先将用 ...
- java 线程 原子类相关操作演示样例 thinking in java4 文件夹21.3.4
java 线程 原子类相关操作演示样例 package org.rui.thread.volatiles; import java.util.Timer; import java.util.Time ...
- 【Java基础】String 相关知识点总结
String 相关知识点总结 字符串的不可变性 概述 String 被声明为 final,因此它不可继承 在 Java8 中,String 内部使用 char 数组存储数据 public final ...
- java中线程中的相关知识点
(1)守护线程必须在线程start前设置(2)守护线程在所有用户线程结束后,也会终止(3)由于(2)所有守护线程不能执行一些读写操作,原因:如果守护线程在执行读写操作时,如果用户线程结束了,守护线程的 ...
- java中IO流相关知识点
(一) 下边使用outputStream字节输出流进行写操作 package zdbIO;import java.io.File;import java.io.FileNotFoundExceptio ...
- java 继承extends 的相关知识点
java只有单继承,不能多继承 子类只能继承父类的非私有成员(成员变量.成员方法) 子类不能继承父类的构造方法,但是可以通过super关键字访问父类的构造方法 继承 要体现子类父类的 继承关系, ”i ...
- Java线程和多线程(一)——线程的基本概念
Java 线程是一个轻量级执行任务的处理单元.Java提供了Thread类来支持多线程,开发者在应用中可以创建多个线程来支持并发执行任务. 在应用中存在两种类型的线程,用户线程和守护线程.当我们启动应 ...
- java线程day-01
综述:下面写的是我学习java线程时做的一些笔记和查阅的一些资料总结而成.大多以问答的形式出现. 一.什么是线程? 答:线程是一个轻量级的进程,现在操作系统中一个基本的调度单位,而且线程是彼此独立执行 ...
- Java线程状态转换
前言:对于Java线程状态方面的知识点,笔者总感觉朦朦胧胧,趁着最近整理资料,将Java线程状态方面的知识点总结归纳,以便加深记忆. 1.Java线程状态值 在Thread类源码中通过枚举为线程定义了 ...
- Java线程和进程相关面试题与答案总结
有几天没有写一写博客了,今天就带给大家一些面试题和参考答案吧! 这些都是上海尚学堂Java培训的学员去面试时遇到的问题,今天总结出来的是Java线程相关类的面试题.把参考答案和解析也发布出来,供大家学 ...
随机推荐
- web259(超详细)
SoapClient看完之后还不是很懂的话就可以去下面的两个网址去补充一下 SoapClient 是 PHP 中用于与 SOAP(Simple Object Access Protocol)服务进行通 ...
- 可视化—gojs 超多超实用经验分享(四)
目录 41.监听连线拖拽结束后的事件 42.监听画布的修改事件 43.监听节点被 del 删除后回调事件(用于实现调用接口做一些真实的删除操作) 44.监听节点鼠标移入移出事件,hover 后显示特定 ...
- Nginx $remote_addr和$proxy_add_x_forwarded_for变量详解
$remote_addr 代表客户端IP.注意,这里的客户端指的是直接请求Nginx的客户端,非间接请求的客户端.假设用户请求过程如下: 用户客户端--发送请求->Nginx1 --转发请求-- ...
- AS自制闹钟学习,关于PendingIntent与AlarmManager
PendingIntent是Intent的封装,不是立刻执行某个行为,而是满足某些条件或触发某些事件后才执行指定的行为实例获取一般为下列5个用法 getActivity() getActivities ...
- 倒装句&强调句
倒装句 你[吃][胡萝卜]了吗? 吃胡萝卜了吗,[你]? 强调点不同 汉语常见于口语表达 英语则常见于书面用语 英语的语序是 主语 谓语(动词) 通常把谓语动词提前 1.完全倒装句 谓语部分完全放在主 ...
- Efficientvit: Enhanced linear attention for high-resolution low-computation visual recognition
GitHub地址: https://github.com/mit-han-lab/efficientvit#usage 相关: https://www.jetson-ai-lab.com/vit/tu ...
- 【转载】 【WarpDrive】GPU加速RL: 一块V100运行上千个智能体、数千个环境,这个「曲率引擎」框架实现RL百倍提速
原文地址: https://mp.weixin.qq.com/s/Vw39k2PteEIGLRhmh2raLQ ============================================ ...
- 树莓派3b+ 安装windows10 arm版本的方法及使用体验
首先,我再网上找到了一个很详细的为树莓派3b安装windows10 arm的教程,实际操作下来发现并不可行. 最后找到了可行的教程: 第3章 将Windows10镜像写入TF卡:https://zhu ...
- 洛谷P1226 【模板】快速幂
1.快速幂模板 前置知识 一个数字n,它的二进制位数一定是log2n向下取整+1: 快速幂模板代码 这段代码实现了快速幂算法(Exponentiation by squaring),用来计算 ( an ...
- CKS考试心得分享
CKS证书 考试相关 考试报名准备 CKS考试和CKA考试一样,已经开放中国大陆的考试.但区别是CKS目前没有中文题目,考试都是英文题目,唯一区别是CKS中文考试是中文老师监考,仅此而已.因此,建议C ...