线程的理解(总结)

说到线程,我们就需要先了解一下进程。

进程是指一个内存中运行的应用程序,都有自己独立的内存空间。进程是独立存在的,它可以启动多个线程

而线程就是进程中的执行流程,一个进程可以启动多个线程。

而线程有包括了单线程和多线程。

首先我们先来看单线程:

  • 因为线程是一个动态执行的过程,所以他也有一个从创建到死亡的过程,它的生命周期有五种状态:

新建~就绪~运行~死亡~堵塞。

新建:创建Thread类的一个实例对象。

就绪:线程启动,此时正在就绪队列中等待获得cpu资源。

运行:此时获得了cpu资源,除非线程自动放弃cpu资源或者有优先级更高的线程进入,否则线程就会一直运行到结束。

死亡:线程执行完毕或者被其他线程杀死,此时线程就进入了死亡状态。

堵塞:由于某种原因导致运行中的线程使cpu暂停了自己的执行,进入了阻塞状态。

正在睡眠:sleep(long t)使线程进入睡眠模式,当指定的时间过去后又会进入到就绪状态。

正在等待:待用wait()方法,调用notify()方法回到就绪状态。

创建线程有两种方法:

第一种是继承Thread类,并且重写Thread类中的run方法,调用线程中的start()方法来开启线程。

第二种是实现Runnable接口,重写Runnable接口中的run()方法,并且通过Thread类来创建线程对象。

而说到多线程我们首先想到的是他的安全问题:

是因为多条语句执行同一个线程共享数据时,一个线程对多条语句只执行一部分,还没有执行完,另一个线程参与进来

导致共享数据报错。

解决他的安全问题我们需要让多条操作共享数据的语句,让一个线程都执行完,并且使用同步代码块来解决(syschronized)

因为创建和销毁线程需要耗费大量的系统资源,为了降低资源的消耗提高相应速度我们就可以使用线程池。

说到线程池我们就需要了解ThreadPoolExcutor类,它是线程池中最核心的一个类,通过他来创建线程池。

我们一般使用四种线程池:

一 :CachedThreadPool:它是可缓存线程池:

  1:这种线程池内部没有核心线程,他的数量是没有限制的

  2:创建任务时,如果有空闲的线程我们就可以调用空闲的线程,没有的话我们就需要新建线程

  3:一定程度减少频繁创建/销毁线程,减少系统的开销

二:FixThreadPool:它是定长线程池:

 1:它的最大线程数等于核心线程数,在默认的情况下线程池的线程不会因为闲置状态超时而被销毁

 2:控制最大并发数,超出的线程会在队列中等待

三:ScheduledThreadPool:它是定长线程池:

 1:设置了核心线程数最大线程数也是Integer.MAX_VALUE

 2:唯一有延迟执行和周期执行任务的线程池

四:SingleThreadExecutor:它是单线程的线程池:

1:有且只有一个线程执行任务

2:所有任务按照指定 的顺序执行,也就是遵循队列的入队出队规则

通过ThreadPoolExecutor来创建线程池有七个构造参数:

1,corePoolSize - 核心池的大小。

2,maximumPoolSize - 线程池最大线程数,如果队列中任务已满,并且当前线程个数小于maximumPoolSize,那么会创建新的线程来执行任务。

3,keepAliveTime - 当前线程数大于corePoolSize,小于maximumPoolSize时,超出corePoolSize的线程称为非核心线程,当非核心线程空闲keepAliveTime后,将会被销毁。

4,Unit - 参数keepAliveTime的时间单位,有七种取值。

5,WorkQueue - 阻塞队列,用来储存的带执行的任务。

6,threadFactory - 线程工厂,主要用来创建线程。

7,handler - 拒绝处理任务时的策略。

首先,线程池通过execute()方法执行某个任务(task),线程池收到这个任务后,


如果当前线程池中的线程数 < corePoolSize,无论之前已经创建的线程是否处于空闲状态,线程池会创建一个新的线程运行这个任务
如果当前线程池中的线程数 > = corePoolSize,线程池会把这个任务添加到等待队列(runnableTaskQueue)中。如果某一个线程空闲了,线程池根据规则从等待队列中取出一个任务执行。
如果当前线程池中的线程数 > corePoolSize, 并且等待队列已经满员,无法再加入新的任务,这时,线程池会创建一个非核心线程执行这个任务。
如果当前线程池中的线程数 = maximumPoolSize,新加入的这个任务会导致线程池抛出一个RejectedExecutionException异常,即线程池拒绝接收这个任务。
一旦线程池中某个线程完成了这个任务,它会去等待队列中拿下一个等待任务。


当线程池中的线程数 > corePoolSize,说明当前线程池中有非核心线程。当某个线程处理完线程后,等待keepAliveTime时间后仍然没有新的任务分配给它,这个线程将会被回收。直到线程数 = corePoolSize时,回收停止。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值