【发布时间】:2011-04-21 01:45:42
【问题描述】:
我正在尝试调整执行以下操作的线程:
只有 1 个线程的线程池 [CorePoolSize =0, maxPoolSize = 1]
使用的队列是ArrayBlockingQueue
Quesize = 20
背景:
线程尝试读取请求并对其执行操作。
但是,最终请求增加得如此之多,以至于线程总是很忙并消耗 1 个 CPU,这使其成为资源占用。
我想做的是,每隔一段时间对请求进行采样并处理它们。可以安全地忽略其他请求。
我要做的就是在“操作”函数中设置一个睡眠,这样对于每个任务,线程都会睡眠一段时间并释放 CPU。
问题:
但是,我想知道是否有一种方法可以使用一个队列,该队列基本上本身会在读取下一个元素之前休眠一段时间。这将是理想的,因为在执行过程中休眠任务并保持执行不完整对我来说听起来并不是最好的。
如果您对任务还有其他建议,请告诉我
谢谢。
编辑: 我添加了一个后续问题here 将 maxpool 大小更正为 1 [匆忙编写] .. 感谢 tim 指出。
【问题讨论】:
-
这并不是真正的“资源消耗”,还有很多工作要做。你真的想人为地减慢请求吗?为什么请求(客户端?)的发送速度比处理速度快?这是不可持续的。
-
好点。如果客户端发出大量请求,但由于队列已满而被拒绝,则它们正在浪费本可以在客户端和执行程序之间更好地平衡的 CPU。队列是一个缓冲区,可以随着时间的推移“平滑”负载;拒绝应该是罕见的,而不是例行公事。
-
客户端并不是真正意义上的请求者的专用客户端。请求者有一个专门的客户端,它会根据请求的数量进行扩展。我正在工作的客户端就像一个额外的日志记录,监控操作类型..因此采样仍然可以很好地了解请求..希望这是有道理的。
-
@p1,您的 maxPoolSize 不能为 0,这违反了 ThreadPoolExecutor 的构造函数中强制执行的不变量。如果您不确定,请使用您正在使用的正确值或您正在使用的确切构造方法更新您的问题。
标签: java multithreading thread-safety threadpool blockingqueue