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线程相关类的面试题.把参考答案和解析也发布出来,供大家学 ...
随机推荐
- 基于Java“镜头人生”约拍网站系统设计实现(源码+lw+部署文档+讲解等)
\n文末获取源码联系 感兴趣的可以先收藏起来,大家在毕设选题,项目以及论文编写等相关问题都可以给我加好友咨询 系统介绍: 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件 ...
- Doris failed to initialize storage reader. tablet=106408, res=[NOT_IMPLEMENTED_ERROR]to be implemented
Apache Doris 2.3 以下的版本会存在一个 bug,导致数据在合并时存在异常,在后续查询该字段数据时会提示 [1105] [HY000]: errCode = 2, detailMessa ...
- Day 11 - 模拟考
WTP 的大洗牌 题目描述 \(\text{input1}\) 3 1 1 1 1 2 3 \(\text{output1}\) 10 0 数据范围 shuffle.zip 第一题 题目描述 输入格式 ...
- CCF 任务调度
样例的示意图 查了一圈,然后很烦,不想学习方法,好卡.查了一些题解,发现都是10分,30分先搁置的博客,最后翻到 堪称官方标称的思路 (CCF题目pat题目各大poj/hdoj好戏那个都没有标程,这里 ...
- WPF MVVM模式简介
WPF是Windows Presentation Foundation的缩写,它是一种用于创建桌面应用程序的用户界面框架.WPF支持多种开发模式,其中一种叫做MVVM(Model-View-ViewM ...
- 【Java】比较业务实体信息变化的工具类
一.业务需求 需要将业务表每次更新操作的前后记录进行保存,写入更新历史表中 方便用户查阅该业务记录发生的历史变化 二.代码实现 import lombok.AllArgsConstructor; im ...
- 【Mybatis-Plus】04 AR (Active Record)
AR模式,全称激活记录 具体操作更接近Hibernate一样的OOP操作方式影响数据库记录 比Hibernate操作更灵活更方便 上手: 首先User实体类需要继承Model类并泛型注入User类型 ...
- TensorBoard标量图中的平滑曲线是如何做的平滑?—— tensorflow TensorBoard标量图中“平滑”参数背后的数学原理是什么?—— 指数移动平均(EMA)
TensorFlow的tensorboard的平滑曲线的实现代码: 使用"指数移动平均"技术实现. 地址: https://github.com/tensorflow/tensor ...
- Jax框架的jit编译是否可以使用循环结构,如果使用循环结构需要注意什么(续)
前文: Jax框架的jit编译是否可以使用循环结构,如果使用循环结构需要注意什么 从前文我们知道,jax的jit中尽可能的不要放入循环结构,因为在jit编译时会将循环结构暂开,因而会消耗掉大量的时间进 ...
- 一个简单的例子测试numpy和Jax的性能对比 (续)
相关: 一个简单的例子测试numpy和Jax的性能对比 numpy代码: import numpy as np import time x = np.random.random([10000, 100 ...