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

Java线程池(1):Java线程池和执行者的基本用途

时间:2023-03-08 16:48:51 网络应用技术

  @[toc]在以前的学习组中学习线程组时,提到了线程池。实际上,线程组不再在我们的日常工作中使用,但是线程池恰恰相反。它是我们日常工作中的重要工具之一。

  我们已经介绍了线程基础和线程的生命周期。基本常识是线程是一个特殊的对象。底层取决于JVM的本机方法,并在JVM虚拟机中实现。与普通对象有所不同,除了在堆上分配对象外,它还需要分配线程堆栈,以及的私人空间与线程执行的大多数任务相比,线程的初始化是一个与数据库相同的任务。一个小的SQL语句。但是,在我们的日常开发工作中,我们的大多数工作内容都将被分解为简短的执行任务。这可以更合理地重复使用资源。这种思想与我们之前提到的Coroutine相同。任务应尽可能小。但是在Java中,该任务不能像Coroutine一样详细。这是e线程可以立即工作,无缝接管我们的任务请求。然后效率将大大提高。这些线程可以处理任何任务。通过这种方式,我们理解实际任务和线程本身。因此,将这些线程重复使用。可以重复使用这些线程。通过可以用作线程池的池对象。在线程池中,我们的线程可以重复使用,而无需每次创建一个新线程。随着时间的推移,时间浪费时间来创建和销毁线程。在同一时间,线程池还具有队列缓冲策略,拒绝机制和动态线程管理。它可以实现线程环境的隔离。线程是错误的,它不会影响其他线程。,资源再利用减少以减少支出。

  在Java中,线程池的主要接口是这两个接口中的执行器和执行人员服务以限制线程池的行为,最重要的是在执行方向中。此后,线程池的实际实现类是AbstractexeceCutorVice类。该类有三个主要实现类:ThreadPoolExecutorService,Forkjoinpool和delegatedExecutorService。

  稍后,我们将分析这三个主要实施类的源代码和实施机制。

  在Java中,我们为我们提供了创建线程池执行者的工厂方法。通过此类,静态方法可以为我们创建大多数线程池。Executors提供了创建线程池的5种方法。让我们看一下此类提供的工厂方法。

  此方法可以创建一个没有固定数量的线程的无界队列的线程池。参数nthreads是最多可以同时处理的线程数。如果所有线程都在处理其他任务,则将提交其他任务,然后这些任务将在等待队列中。直到有一个线程可用。如果任何线程在关闭执行过程之前终止,则需要由于故障而终止它,并且在执行执行时需要更换新线程,请如下 -向上任务。线程池中的所有线程将始终存在,直到调用显示的关闭方法为止。此LinkedBlockingqueue的底层是链接列表结构,其允许队列长度为integer.max_value。

  这样,如果我们在使用过程中无法很好地控制,它可能会导致内存溢出和OOM异常。因此,实际上不提倡此方法。我们在使用过程中应仔细地使用它。NewFixedThreadPool(int nhreads,thread,threadfactory threadfactory)方法::

  该方法与3.1中NewFixedThreadPool(int nthreads)的方法之间的唯一区别是增加threadFactory参数。在上一个方法中,线程的创建使用默认实现epecutors.defaultthreadfactory()。在此方法中,您可以自定义。根据您的需要。

  此方法将使用线程创建一个线程池和无与伦比的队列。应注意,如果该执行线程由于执行过程中的故障而终止,则在执行执行时需要更换新线程,然后才能替换。,上述线程池可以确保任务的顺序,并且在任何时间的活动状态中都不会有多个线程。与newFixedThreadPool(1)不同,返回的executorService返回使用newsinglethreadexexecutor无法重新分配 -线程数。返回newfixexecutor(1)返回的执行人员服务,可以重新分配其活动的线程数。此问题后来详细分析了此问题。newSingleThreadExecutor(threadfactory threadfactory)方法:::::::::::: :::::::::::

  该方法与3.3中的newlethreadexecutor之间的区别是添加螺纹效果。您可以自定义创建线程的方法。

  该方法用于创建一个线程池,该线程池可以自动增加线程。也可以重复使用先前的线程。该线程池通常改善许多短暂性能的性能。执行,它将重复使用先前的结构性线程。如果没有可用的线程,请创建一个新线程以添加到池中。如果没有使用线程,则将线程终止并从缓存中删除60秒资源在足够长的时间内。您可以使用threadpoolexecutor构造函数创建具有相似属性但信息不同的线程池。应注意,该方法创建的线程池,尽管队列的长度是可控的,但线程的数量为integer.max_value。在这种情况下,如果不正确使用,也存在OOM的风险。例如,我们使用的每个任务相对较长,并且任务的请求非常快。,,,,因此,这不可避免地会在单元时间内引起大量线程。结果,内存溢出。newcachedhreadpool(threadfactory threadfactory)方法::

  该方法之间的区别还在于,线程捕获物可以自己指定线程的创建。

  创建一个线程池,在指定的延迟时间之后运行任务。稍后threadPoolExecutor源代码,然后分析此类的源代码。类似方法:

  通过此方法,我们可以指定threadfactory.customized thread Creation。相似地,我们还可以指定一个线程:

  可以实现上述两种方法,但应注意,这两种方法返回到外层并包装包装类。

  JDK 1.8.LET首先查看源代码之后,将新添加此方法:

  该方法实际上返回forkjoinpool。此方法创建一个线程池,该线程池维持足够的线程以支持并行级别,并且可以使用多个队列来减少竞争。并行级别用于活动参数或可用于任务的最大线程数量处理线程的实际数量可以动态增长和缩小。但是,应注意的是,扣押线程池的工作不能保证提交任务的执行顺序。新工作策划池之间的最大差异是,创建的任务队列是多个而不是一个,因此在执行队列中的所有任务之后,都无法转动任务。它可以通过多个队列并行执行。此并行性是并行性的大小。在ShetingPool中,在窃取了多少个线程,在该方面处理了多少个线程。背景根据并行性。EATH线程有一个工作队列。然后假设线程的任务已完全执行并且工作队列为空,则他将前往其他线程队列以执行任务。这是一个被称为窃取的工作。

  然后,它将使用Runtime.getRuntime()。可用处理器()作为线程池操作的并行性。

  在Java物种中,线程池提供了两种通话方式。通过提交任务。这只是提交可运行的普通线程并且无法返回执行结果的一种方法。另一种方法是提交Callace任务并返回未来对象。执行结果可以通过未来对象获得。

  上述代码的执行结果:

  这些是两个线程提交方法中的执行结果。如果我们需要直接获得线程的执行结果,而不是通过共享内存来实现,我们最好使用第二个,未来。似乎是异步的,它实际上是一种同步方法,因为执行结果需求索。因此,在这种情况下,在Java1.8中引入了新的异步界面完整空格。这是该完整future分析的重点。

  本文介绍了Java Mid -thread池的创建方法,以及线程池工厂方法的五个线程池类型执行器。应该指出的是,在ALI规格中不建议使用这五个线程池中的某些。在本文中:“禁止使用执行者创建线程池的ALI标准分析”。访谈过程中的频率访谈内容。稍后将详细分析某些重要类别的源代码。彻底了解线程池的基本原理。

  原始:https://juejin.cn/post/710265401392496407