当前位置: 首页 > 知识库问答 >
问题:

ThreadPoolExecutor-在队列前使用线程

韶亮
2023-03-14
  1. 如果正在运行的线程少于corePoolSize线程,则执行器宁愿添加一个新线程,而不是排队。2)如果corePoolSize或更多线程正在运行,则执行器更喜欢将请求排队,而不是添加新线程。
  2. 如果请求无法排队,将创建一个新线程,除非该线程将超过maximumPoolSize,在这种情况下,任务将被拒绝。

第一种情况是可以的,但我想要的是,当核心线程被利用时,任务不需要排队(即使在有界队列的情况下,比如大小为100)并等待核心线程空闲或队列满,而是从非核心池配额中创建一个新线程。和实时应用程序一样,我的应用程序不能忍受任务排队等待的想法。

所以我想要的是CoreThreads->Non-CoreThreads->Queue而不是CoreThreads->Queue->Non-CoreThreads。

现在,一种方法是扩展ThreadPoolExecutor类并重写execute方法,但我必须几乎复制完整的类。这是我能想到的肮脏的方式。有人能提出其他方法吗。

注意:我不能使用cachedThreadPool,因为需要限制线程的数量。

共有1个答案

公西繁
2023-03-14

我在这里看到的更多的是设计问题,而不是线程包问题。

一种是使用线程来减少延迟或增加吞吐量。假设您创建了600个线程,这更多的是为了增加服务器上的吞吐量。然而,任何现代服务器都没有600个CPU核,您将遭受严重的上下文切换。让固定数量的线程在一组队列上工作很简单,也更有效。

如果您真的认为您的情况是合理的,只需创建您自己的接口包装一个标准线程池,并在单独的线程上启动一个自定义逻辑。然而,我真的怀疑这会提高您的系统性能

 类似资料:
  • 根据我的理解,ThreadpoolExecitor有两个主要的数据结构(工人,workQueue)用于管理tasks.worker(Set)有线程,这些线程将一直运行到执行器关闭,workerQueue将所有任务保留到执行器。但是根据代码,我没有看到所有任务都被添加到workQ中ueue.task仅在第1361行添加到队列中,不会在每种情况下都执行。

  • 问题内容: 我无法创建新线程。实际上,我编写了一个有点黑的程序,可以接受任何任务(即,它是不受限制的),但是调用了一个附加处理程序- 在我的应用程序中,它会发出警告跟踪表明该池已落后-这为我提供了TPE拒绝创建的非常明确的信息新队列,即使队列中有成千上万的条目。我的构造函数如下: 为什么不创建新线程? 问题答案: 此博客文章介绍了这一难题: 这种线程池的构造根本无法按预期工作。这是由于Thread

  • 我需要能够更改ThreadPoolExecator的任务队列的大小。当然,BlockingQueue不支持更改大小,ThreadPoolExecitor不支持更改队列。 所以,我想到的方法是使用ThreadPoolExecutor。shutdownNow(),它返回了一个尚未执行的可运行程序列表。然后,我可以创建一个具有所需队列大小的新执行器,并重新提交所有任务。 问题是在shutdownNow(

  • 问题内容: 我正在尝试同时使用和。 由于每个池(毕竟是一个池)都将线程重用,这意味着无法正常工作,因此出现了故障。现在这个问题对我来说似乎很明显,但要追踪它尤为困难。 我这样使用,以便几个顶级进程中的每个进程都有自己的数据库连接以及它产生的任何子进程。我不只是使用一个共享的连接池,因为在提交数据库和/或准备大量重复使用的PreparedStatement之前,每个顶级进程都会对其连接进行很多多步骤

  • 问题内容: 我想在python中使用线程下载大量网页,并通过以下代码在网站之一中使用队列。 它放置了一个无限的while循环。是否每个线程都连续运行,直到所有线程完成才结束?我错过了什么吗? 问题答案: 将线程设置为线程会使线程在主线程完成后退出。但是,是的,您是正确的,只要线程中的某些内容将阻塞,线程将连续运行。 该文档解释了此详细信息Queue docs python Threading文档也

  • 本文向大家介绍ThreadPoolExecutor线程池的使用方法,包括了ThreadPoolExecutor线程池的使用方法的使用技巧和注意事项,需要的朋友参考一下 ThreadPoolExecutor ThreadPoolExecutor线程池,java提供开发框架,管理线程的创建、销毁、优化、监控等。 有4种不同的任务队列: 1.ArrayBlockingQueue:基于数组结构的任务队列。