当前位置: 首页 > 网络应用技术

一篇文章了解Java线程池

时间:2023-03-06 14:04:38 网络应用技术

  1继承线程类并重写运行方法。实现很简单,但它不符合Erhi替换的原理,并且不能继承其他类别。

  (1)继承线程类并重写运行方法,运行方法的方法表示完成线程的任务。因此,Run()方法称为执行正文。

  (2)创建一个线程对象并调用开始方法开始

  2实现可运行的接口并重写运行方法。避免单个继承的局限性,编程更灵活,并且可以实现解耦。

  (1)实现可运行的接口并重写运行方法

  (2)创建一个线程对象并调用开始方法开始

  3实现可可接口并重写呼叫方法。您可以获取线程执行结果的返回值并引发异常。

  (1)定义一个类以实现可可接口并实现呼叫()方法。call()方法将作为线程执行并具有返回值。

  (2)创建一个线程对象,使用FutureTask类来包装可可的对象,然后调用开始方法开始futureTaskft = new FutureTask<>(MC);

  (3)调用FutureTask对象的GET()方法,以在执行子线程后获得返回值

  4使用执行者工具创建线程池

  考虑一下我们之前使用线程池的使用何时,每个创建线程都是:浪费的性能操作。Furthermore,两个或三个线程很好,但是如果需要数百个线程?当使用使用时,它将在被摧毁时一一将其销毁。创建和破坏的性能数百个线程不好!

  线程池的诞生是解决上述问题。核心思想是:螺纹重复使用。换句话说,在螺纹用完后不会被破坏。将其放在池中等待新任务的到来,并反复使用n线程执行所有新任务。这带来的费用只会是n线程的创建,并非每个请求都会带来生活中的线程死亡。

  因此,使用线程池的好处和优势:

  创建可以通过静态出厂方法创建的线程池:

  不建议使用它,而是使用使用方法。对刚性同学的这种处理使线程池运输的规则清楚并避免了资源耗尽的危险。

  上源代码(七个参数):

  CorePoolsize:核心线程号码

  默认情况下,在创建线程池之后,线程池中的线程数为0。在有任务时,将创建一个线程以执行任务。核线程定义可以在该任务上运输的线程数同一时间。当线程池中的线程数到达CorePoolsize时,将放置工作队列的任务。默认情况下不会回收借口,但是如果将允许时间设置为true,则当核心线程为ive时,它也将被回收。

  ②maximumpoolsize:最大线程数

  当存储在队列中的任务达到队列容量时,当前同时运行的线程数将成为线程的最大数量。如果核心线程设置的数量表示固定的大小线程池。

  ③工作台:工作队列

  当线程请求的数量大于或等于CorePoolSize时,线程将进入工作队列。阻止队列用于存储等待执行的任务。提交新任务后,它将首先输入工作队列,然后在任务计划时从队列中删除任务。阻止队列此处具有以下选项:

  ④单元:keepalivetime的单元,时间单元。例如:

  ⑤keepalivetime:线程空闲时间

  线程空闲时间达到值后,它将被破坏,直到只剩下一个线来避免浪费内存资源。

  ⑥线程:线程工厂

  当线程池需要新线程时,它将用于生成新线程

  默认使用主要负责创建线程。方法。创建的线程在同一线程组中,优先级相同。有利于分析错误。

  ⑦处理程序:拒绝策略。

  功能:触发拒绝策略时,直接提出了拒绝执行的异常,而暂停该策略的含义是中断当前的执行过程

  使用方案:没有特殊的场景,但是必须适当处理抛出的异常情况。

  ThreadPoolExecutor中的默认策略是,一系列流产柜,一系列流型式策略和执行人员服务界面,因为没有显示任何设置拒绝策略,这是默认,请注意,请注意,线程池实例queue queeue queeue queeue queeue queeue queeue queeue queeue在执行人员服务中是无限的,也就是说,它不会触发拒绝策略破坏内存。当您自定义线程池实例时,您必须使用此策略在触发策略时处理异常投掷,因为他会中断当前电流执行过程。

  它可以像这样创建:executorService myExeCutorService = executors.netcachedthreadpool();

  ①核心线程池不满,创建一个新的线程执行任务,此时工作核 < corePoolSize,需要获取全局锁。

  ② 如果核心线程池已满,工作队列未满,将任务存储在工作队列,此时 workCount >= CorePoolSize。

  ③如果工作队列已满,则线程数小于最大线程数,并且创建了一个新的线程处理任务。此时,工作核 < maximumPoolSize,这一步也需要获取全局锁。

  ④ 如果超过最大线程数,按照拒绝策略来处理任务,此时 workCount > maximumpoolsize。

  当线程池创建线程时,该线程将被封装到工作线程工人中。执行任务后,工人还将在工作队列中分发任务以执行它。

  例如:

  线程池的参数配置:5个核心线程,10个最大线程和100个队列。

  然后,线程池在启动时不会创建任何线程。如果请求有6个,将创建5个核心线程来处理五个请求,另一个将输入尚未处理的队列。这次,有99个请求。发现线程池充满了核心线程,队列仍处于99个位置,因此它将在队列中输入99个,再加上100个位置。池将打开五个非核心线程来处理这五个请求。当前情况是线程池中的线程数为10个运行状态,而队列中的100个线程也已满。如果您此时提到另一个请求,直接采用拒绝策略。

  线程池中和之间有什么区别?

  您可以致电或方法关闭线程池。原理是遍历线程池中的工作线程,然后调用线程的中断方法以中断线程。无法响应中断的任务可能永远不会终止。

  CPU密度类型:此任务通常不会占用大量IO,因此可以快速处理背景服务器,并且压力落在CPU上。

  I/O密集型类型:通常有大量的数据查询查询和批处理插入操作。目前,压力主要在I/O上。

  一般而言,如何设置线程池的大小(线程池开头的默认核心线程数?)(其中,n是CPU的数量)。

  对于缺点,请纠正我!