
我讨论了4个常见Java线程锁的特征,这些锁与太多线程,性能比较和使用情况有关. 今天,我主要分享相关内容. 这些是Java面试的必要测试点.
为什么需要它
为了提高Java的并发性,可以使用多个线程一起执行,但是如果在短时间内创建和销毁大量线程,将占用大量系统时间并影响系统效率.
为了解决上述问题,已引入Java,以使创建的线程可以在指定的时间内由系统管理,而不是在执行过程中创建并在执行后销毁,从而避免了线程的频繁创建和销毁. 系统开销.
如何使用它,以及实现原理,处理步骤以及使用注意事项是什么. 今天,我们主要从这些方面介绍Java.

处理流程
以ThreadPoolExecutor为例. 当我们将Runnable交给线程池执行时,该线程池的处理流程如下:

首先确定线程池中的核心线程是否空闲. 如果它们空闲,则将此新任务分配给某个空闲线程以执行. 如果没有空闲,并且当前线程池中的核心线程数仍小于corePoolSize,则创建另一个核心线程. 如果线程池中的线程数已达到核心线程数,并且这些线程正忙,请将此新任务放入等待队列. 如果等待队列再次满,请检查当前线程数是否已达到maximumPoolSize,如果尚未达到,请继续创建线程. 如果到达,则将其移交给RejectedExecutionHandler(拒绝策略)以决定如何处理此任务. 使用线程池(ThreadPoolExecutor)

在Java中,线程池的概念是Executor接口,它专门实现为ThreadPoolExecutor类,它是线程池中的核心类. 因此,如果您想彻底了解Java中的线程池,则必须了解此类.
ThreadPoolExecutor继承了AbstractExecutorService类,并提供了四个构造函数:
公共类ThreadPoolExecutor扩展了AbstractExecutorService {
... ..
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,长keepAliveTime,TimeUnit单位,
BlockingQueue
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,长keepAliveTime,TimeUnit单位,
BlockingQueue
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,长keepAliveTime,TimeUnit单位,
BlockingQueue

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSizejava线程池执行原理,长keepAliveTime,TimeUnit单位,
BlockingQueue
...
}
ThreadPoolExecutor继承AbstractExecutorService类并提供四个构造函数. 实际上,通过观察每个构造函数的源代码的特定实现,可以发现前三个构造函数是第四个构造函数执行的初始化工作.
以下说明了构造函数中每个参数的含义:
1.corePoolSize(线程池的基本大小)
向线程池提交任务时,即使其他空闲的基本线程可以执行新任务,线程池也将创建一个线程来执行任务,该线程将被创建,并等待要执行的任务数执行的值大于不再创建的线程池的基本大小. 如果调用了线程池的prestartAllCoreThreads方法,则线程池将提前创建并启动所有基本线程.
2.runnableTaskQueue(任务队列)
一个阻塞队列,用于保存等待执行的任务. 可以选择以下阻止队列.

3.maximumPoolSize(线程池的最大大小)
线程池中允许的最大线程数. 如果队列已满,并且创建的线程数小于最大线程数,则线程池将创建新线程来执行任务. 值得注意的是,如果使用无限制任务队列,则此参数无效.
4.ThreadFactory: 用于设置线程创建工厂
您可以通过线程工厂为每个创建的线程设置一个更有意义的名称,这在调试和查找问题时非常有用.
5.RejectedExecutionHandler(饱和策略)
当队列和线程池已满时,表明线程池已饱和,则必须采用策略来处理提交的新任务. 默认情况下,此策略是AbortPolicy,这意味着当无法处理新任务时会引发异常. 以下是JDK1.5提供的四种策略. n AbortPolicy: 直接引发异常.
6.keepAliveTime(线程活动保留时间)
线程池中的工作线程在空闲后保持空闲的时间. 因此,如果任务很多,并且每个任务的执行时间相对较短java线程池执行原理,则可以增加此时间以提高线程利用率.
7. TimeUnit(线程活动保留时间的单位)
可用单位为DAYS,HOURS,MINUTES,MILLISECONDS,Mseces(微秒,1/1000毫秒)和ns(NANOSECONDS,1/1000微秒).

关于线程池的注释
尽管线程池可以极大地提高服务器的并发性能,但是使用它存在一定的风险. 与所有多线程应用程序一样,使用线程池构建的应用程序容易出现各种并发问题,例如竞争共享资源和死锁. 另外,如果线程池本身的实现不可靠,或者线程池使用不当,也可能导致与线程池有关的问题,例如死锁,系统资源不足和线程泄漏.
1)建议使用新的ThreadPoolExecutor(…)方法创建线程池
不应使用线程池创建
执行器创建,但通过ThreadPoolExecutor
创建,以便读者可以更清楚地了解线程池的参数设置和运行规则,并避免资源耗尽的风险,这也是阿里巴巴JAVA开发手册中明确要求的. 这一点不可小.. 一些学生曾经由于不正确地使用线程池而无法创建线程池,从而导致在生产中的同一台计算机上部署了多个应用程序.
2)合理设置线程数
线程池中工作线程数的设置应根据实际情况进行配置. 占用大量CPU的服务(搜索,排序等)具有较少的CPU空闲时间,并且线程数不能设置太多.
如果这是一项占用大量CPU的任务,则需要尽可能地挤压CPU,参考值可以设置为NCPU + 1
如果它是IO密集型任务,则参考值可以设置为2 * NCPU
3)设置可以代表特定业务的线程名称
这使得通过日志的线程名称轻松识别业务. 通过指定ThreadPoolExecutor的ThreadFactory参数可以实现特定的实现,例如Spring提供的CustomizableThreadFactory.
奖励
[mike.r.chen@163.com]
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-204654-1.html
想骚扰一下