线程和线程池

什么是线程和进程
在这里插入图片描述
进程的基本原理:如上图,程序段一般也被称为代码段。代码段是进程的程序指令在内存中的位置,包含需要执行的指令集合;数据段是进程的操作数据在内存中位置,包含需要操作的数据集合;程序控制块包含进程的描述信息和控制信息,是进程存在的唯一标识
进程是并发执行的,任何进程都可以同其他进程一起执行。在进程内部,代码段和数据段有自己的独立地址空间,不同进程的地址空间是相互隔离的

线程的基本原理:线程时指"进程代码段"的一次顺序执行流程。线程是CPU调度的最小单位。一个进程可以有一个或多个线程,各个线程之间共享进程的内存空间、系统资源,进程仍然是操作系统资源分配的最小单位

线程和进程的区别:

1. 线程是"进程代码段"的一次顺序执行流程。一个进程由一个或多个线程组成,一个进程至少有一个线程
2. 线程是CPU调度的最小单位,进程是操作系统分配资源的最小单位。线程的划分尺度小于进程,使得多线程程序的并发性高
3. 线程时出于高并发的调度诉求从进程内部演进来的。线程的出现既充分发挥了CPU的计算性能,又弥补了进程调度过于笨重的问题
4. 进程之间相互独立,但进程内部的各个线程之间并不完全独立。各个线程之间共享进程的方法区内存、堆内存、系统资源(文件句柄、系统信号等)
5. 切换速度不同:线程上下文切换比进程上下文切换要快的多。所以有时,线程也称为轻量级进程

上下文切换就是当发生的任务进行切换时,需要保存当前任务的寄存器到内存,将下一个即将切换的寄存器状态恢复CPU中,使其继续运行;在任务间进行切换时,需要花费大量的时间用于保存和恢复寄存器和内存页,更新内核相关数据结构等操作

并发是多个任务同时在一个CPU上运行(通过时间片进行切换,不是真正的同时)
并行是多个任务在不同CPU上同时运行

多线程带来的问题:
线程上下文切换,死锁,在多线程中资源运行在各自的线程中,各不可见;
有序性:对于一个线程内的所有操作都是有序的,但当前线程对于其他线程而言的所有操作是无序的,因为指令重排序
原子性:要么执行,要么不执行,在Java内存模型中,原子性的变量操作read,load,assign,write,store,use,也可以通过lock和unlock进行保证,或者通过synchronize的monitorenter 和 monitorexit 隐式操作
可见性:一个线程修改了变量的值,在其他线程也可以看见;可以通过volatile或者synchronize来设置可见性
死锁:多个线程同时被阻塞,它们中的⼀个或者全部都在等待某个资源被释放。由于线程被⽆限期地阻塞,因此程序不可能正常终⽌
死锁排查
1.通过jstack -l PID发现
2.通过jconsole中检查死锁功能
3.通过jvisualvm 的线程dump发现
4.通过jmc的jmx控制台发现
5.通过Arthas 的thread -b指令发现

happens-before 规则:
1。程序顺序执行规则(as-if-serial 规则)
在同一个线程中,有依赖关系的操作按照先后顺序,前一个操作必须先行发生于后一个操作(Happens-Before)。换句话说,单个线程中的代码顺序无论怎么重排序,对于结果来说是不变的
2。volatile变量规则
对volatile(修饰的)变量的写操作必须先行发生于对volatile变量的读操作
3。传递性规则
如果A操作先于B操作,而B操作又先行发生于C操作,那么A操作先行发生于C操作
4。监视锁规则(Monitor Lock Rule)
对一个监视锁的解锁操作先行发生于后续对这个监视锁的加锁操作
5。start规则
对线程的start操作先行于这个线程内部的其他任何操作。具体来说,如果线程A执行B.start()启动线程B,那么线程A的B.start()操作先行发生于线程B中的任意操作
6。join规则
如果线程A执行了B.join()操作并成功返回,那么线程B中的任意操作先行发生于线程A所执行的ThreadB.join()操作

JMM内存模型:
·read 读取:作用于主内存,将共享变量从主内存传送到线程的工作内存中。
·load 载入:作用于工作内存,把 read 读取的值放到工作内存中的副本变量中。
·store 存储:作用于工作内存,把工作内存中的变量传送到主内存中。
·write 写入:作用于主内存,把从工作内存中 store 传送过来的值写到主内存的变量中。
·use 使用:作用于工作内存,把工作内存的值传递给执行引擎,当虚拟机遇到一个需要使用这个变量的指令时,就会执行这个动作。
·assign 赋值:作用于工作内存,把执行引擎获取到的值赋值给工作内存中的变量,当虚拟机栈遇到给变量赋值的指令时,就执行此操作。
·lock锁定: 作用于主内存,把变量标记为线程独占状态。
·unlock解锁: 作用于主内存,它将释放独占状态。

线程池:
由于每次手动创建销毁线程对于系统的开销很大,为了降低系统的性能损耗,通过线程池来维护、管理、监督每个线程
线程池的参数

参数名类型含义
corePoolSizeint核心线程数,即使空闲也不会被回收
MaxPoolSizeint最大线程数
keepAliveTimelong保存存活时间
workQueueBlockingQueue任务存储队列
threadFactoryThreadFactory线程池创建新线程的线程工厂类
HandlerRefectedExecutionHandler线程无法接收任务时的拒绝策略

在这里插入图片描述
自动创建线程池:
newSingleThreadExecutor:单线程化的线程池,也就只有一个线程的线程池
1.单线程化的线程池中的任务是按照次序顺序执行
2.池中的唯一线程的存活时间是无限的
3.当池中的唯一线程繁忙,新提交的任务会进入队列,且队列的无界的

newFixedThreadPool:固定数量的线程
1.如果线程数没有达到设置的固定数量,每次提交一个任务在线程池内会创建一个新线程,直到达到固定的数量
2.达到固定数量,新的任务就会添加到队列,且队列无界

newCachedThreadPool:可缓存的线程池
1.接收新的任务时,如果池内所有线程繁忙,此线程池就会添加新线程来处理任务
2.不会对线程池大小进行限制,线程池大小完全依赖于操作系统或者JVM所能够创建的最大线程大小
3.如果部分线程空闲,如果线程60s不执行任务时,会回收这个空闲线程

newScheduledThreadPool:可调度线程池

ThreadLocal引起的内存泄漏:
1.线程长时间运行而没有被销毁。线程池中的Thread实例很容易满足次条件
2.ThreadLocal引用被设置为null,且后续在同一Thread实例执行期间,没有发生对其他ThreadLocal实例的get,set,remove操作,只要存在一个针对任何ThreadLocal实例的get、set、remove操作,就会触发Thread拥有的ThreadLocalMap的key为null的Entry清理工作,释放掉ThreadLocal弱引用为null的entry

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,线程是程序执行的基本单元,用于并发执行任务。每个线程都有自己的生命周期,包括创建、运行、阻塞和终止。线程的创建可以通过继承Thread类或实现Runnable接口来实现。 线程池则是Java中一种高效的线程管理机制,它预先创建一定数量的工作线程,并在需要执行任务时从线程池中获取线程进行处理,当任务完成后,线程会返回到线程池等待下一次调度,而不是立即结束。这样可以避免频繁地创建和销毁线程带来的开销,提高系统的性能和资源利用率。 以下是Java线程线程池的一些关键点: 1. **线程创建**: - **继承Thread类**:创建自定义线程类并重写run()方法。 - **实现Runnable接口**:创建Runnable接口的实现类,提供run()方法,然后用Thread构造函数创建Thread实例。 2. **线程状态**: - 新建(New):线程对象被创建但还未启动。 - 运行(Runnable):线程正在执行run()方法。 - 阻塞(Blocked):线程因某个条件而暂停,如I/O操作等待数据。 - 等待(Waiting):线程在调用wait()方法后,进入等待状态,直到被其他线程唤醒。 - 守护(Terminated):非守护线程完成或主线程结束,守护线程自动退出。 3. **线程池组件**: - ExecutorService:线程池的核心接口,提供了提交任务和控制线程的方法。 - ThreadPoolExecutor:实现了ExecutorService,包含核心线程数、最大线程数、任务队列等配置。 - ScheduledThreadPoolExecutor:支持定时和周期性任务。 4. **线程池的优势**: - **资源复用**:减少线程创建和销毁的开销。 - **线程管理和调度**:灵活设置线程数量、线程优先级和任务执行策略。 - **避免死锁**:由于任务有顺序地等待特定资源,减少了死锁的可能性。 - **可扩展性**:随着任务增加,线程池可以根据需要动态调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值