线程

113 阅读6分钟

本文是自己笔记 基础知识不说了,比如什么是线程 一、线程的实现两个方式,一个是继承thread,二是实现runable接口。 线程的和进程之间的一个关系,首先理解进程,进程也就是说是一个系统对于资源和分配的一个独立的单位,也就是说进程是可以独立运行的一个玩意,线程是在进程的基础上的一个cpu调度和分派的基本单位,线程是一个比进程还要独立小的基本单位,也就是这个样子说,进程相当与一个程序,而这个线程则是一个方法或者是一个类,这就是线程~ 二、二者的关系是: 1、一个线程必须只有一个进程,而进程不止一个线程可以有多个,但是至少有一个线程,也就是我们多说的那个主线程,除了主线程之外我们还有一个守护线程,还有非守护线程用户线程 2、资源分配给进程,同一进程的所有线程共享该进程的所有的资源 3、线程之间的通信需要协作同步,不同的线程之间要利用消息通信的办法实现同步 4、线程是指进程的一个执行单元,也是进程内的可调度实体 三、线程加锁的一个问题(synchronized) 锁的问题,顾名思义就是给一个程序加上锁,然后对于锁的问题,有一个实例说明一下,ps:A和B出去同时去取钱,这个A和B是一个父子关系,然后,A对B说你去那边银行去把,我去这边的ATM机里去,然后这个对父子就屁颠屁颠的去了,后来啊,他们两个同时进入了取钱的页面,然后卡里就有1000块钱,可是两个人都是想取1000,这时候涉及到加锁的问题了,不能说就是两个人都能取出来这个钱吧,所以这个时候就要发挥强大的锁的能力,把这个B也就是他的儿子给锁起来,当然不是锁这个人,是把他的程序给锁起来,让他自己不能使用,这时候这个锁牵扯到两个一个是同步锁,一个是异步锁。 一个线程启动起来了,我们要让他进行一个停止,有三种的方法: 1、是使用退出标志,也就是使用这个run方法后线程终止, 2、就是使用stop这个这个方法强行的进行线程的关闭,不推荐使用也就不安全。 3、使用interrupt方法中断线程。 interrupt()方法 仅仅使线程中打了一个停止的标记,并不是真的停止线程。 this.interrupted() 测试当前线程是否已经中断。 this.isInterrupted()测试线程是否已经中断。 这个地方要注意一个点就是如果线程sleep方法这个里面则是如果这个线程被堵塞了,需要用这个Interrupt这个方法,这叫做“半路唤醒”

image.png notify这个方法就是一个通知的管理就是通知,直接上实列,就是一个吃饭等着吃烤排的一个例子,没有了你在回座位坐着,然后呢,这个方法也就是说告诉你说,哎!!这个你来吧烤排吧,烤排好了,所以这个的意思就是说给你一个通知,那个notifyAll的意思就是告诉全部,哎!烤排好了

image.png 仔细查看这幅图图片,这个图片很好,从这个图中看一出来,线程是有可运行状态还有这个运行的状态,从这个运行中状态到可运行状态是有三种的。 说一下这个.join()还有这yieid()这个方法,首先就是这个join这个方法,这个的意思是,比如有一个线程然后有一个线程使用了join这个方法,然后呢,先执行这个join这个方法,然后在执行原本线程中的那个,然后这个yieid这个的意思是能让线程从运行状态变成一个可运行状态。见图可知

接下来就是线程池,线程池少写点,先说概念线程池的概念是是一个可以容纳多个的容器,其中的线程是可以重复的使用的这个叫做是线程池,也就说省去了大量的实践无需大量的创建线程而造成和浪费更多的资源。 线程池里面有一个顶级的接口也就是一个Executor,ExecutorService 的默认实现是ThreadPoolExecutor;Executors:线程池创建工厂类,线程池一共创建了四种的线程池Executors 提供四种线程池:(仔细阅读即可,不用死记硬背) 1)newCachedThreadPool 是一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用 execute() 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。注意,可以使用 ThreadPoolExecutor 构造方法创建具有类似属性但细节不同(例如超时参数)的线程池。 2)newSingleThreadExecutor 创建是一个单线程池,也就是该线程池只有一个线程在工作,所有的任务是串行执行的,如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它,此线程池保证所有任务的执行顺序按照任务的提交顺序执行。 3)newFixedThreadPool 创建固定大小的线程池,每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小,线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。 4)newScheduledThreadPool 创建一个大小无限的线程池,此线程池支持定时以及周期性执行任务的需求。