Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Keep alive如何使用ThreadPoolExecutor?_Java_Multithreading_Keep Alive - Fatal编程技术网

Java Keep alive如何使用ThreadPoolExecutor?

Java Keep alive如何使用ThreadPoolExecutor?,java,multithreading,keep-alive,Java,Multithreading,Keep Alive,作为我发布的一篇文章的延续,我试图在我的代码库中使用。即使在反复尝试从Java API文档中理解之后,我也无法清楚地理解要在构造函数中传递的keepAliveTime参数背后的功能/目的。希望有人能用一些好的工作实例来解释我 摘自Java文档: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepA

作为我发布的一篇文章的延续,我试图在我的代码库中使用。即使在反复尝试从Java API文档中理解之后,我也无法清楚地理解要在构造函数中传递的
keepAliveTime
参数背后的功能/目的。希望有人能用一些好的工作实例来解释我

摘自Java文档:

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue)
public ThreadPoolExecutor(int-corePoolSize,
int maximumPoolSize,
长时间,
时间单位,
阻塞队列(工作队列)

keepAliveTime
-当线程数大于核心时,这是多余空闲线程在终止前等待新任务的最长时间。

假设核心大小为5,最大大小为15。由于某些原因,您的池变得繁忙,并使用所有15个可用线程。最终,您会耗尽要做的工作——因此,当您的一些线程完成最后的任务时,它们会变得空闲。因此,其中的10条线被允许死亡


但是,为了避免它们被过快杀死,可以指定保持活动时间。因此,如果将1指定为
keepAliveTime
值,将
TimeUnit.MINUTE
指定为
unit
值,则每个线程将在完成任务后等待一分钟,以查看是否还有更多工作要做。如果仍然没有给它更多的工作,它会让自己完成,直到池中只有5个线程——池的“核心”为止。

下面是Javadoc的更多描述:

<dt>Keep-alive times</dt>
 *
 * <dd>If the pool currently has more than corePoolSize threads,
 * excess threads will be terminated if they have been idle for more
 * than the keepAliveTime (see {@link
 * ThreadPoolExecutor#getKeepAliveTime}). This provides a means of
 * reducing resource consumption when the pool is not being actively
 * used. If the pool becomes more active later, new threads will be
 * constructed. This parameter can also be changed dynamically
 * using method {@link ThreadPoolExecutor#setKeepAliveTime}. Using
 * a value of <tt>Long.MAX_VALUE</tt> {@link TimeUnit#NANOSECONDS}
 * effectively disables idle threads from ever terminating prior
 * to shut down.
 * </dd>
 *
保持活动时间
*
*如果池当前有多个corePoolSize线程,
*如果多余的线程空闲了更长的时间,那么它们将被终止
*超过keepAliveTime(请参见{@link
*ThreadPoolExecutor#getKeepAliveTime})。这提供了一种
*在池未处于活动状态时减少资源消耗
*用过。如果池稍后变得更活跃,则将创建新线程
*建造的。此参数也可以动态更改
*使用方法{@link ThreadPoolExecutor#setKeepAliveTime}。使用
*Long.MAX_value{@link TimeUnit#纳秒}的值
*有效地禁止空闲线程终止以前的线程
*关闭。
* 
*

本质上,这只允许您控制空闲池中剩余的线程数。如果你把它做得太小(对于你正在做的事情),你将创建太多的线程。如果将其设置得太大,将消耗不需要的内存/线程。

下面是代码示例,演示了keepAliveTime的工作

作为一个术语,当我认为你的意思是“使用”时,你已经两次使用了“实施”这个词。您并不是试图通过编写自己的代码来实现该API来实现
ThreadPoolExecutor
——您只是创建了一个
ThreadPoolExecutor
,您想知道它将如何运行,对吗?是的,您是对的。我只是说它是我的代码库中的一种新的实现,但它不是
ThreadPoolExecutor
的实现。如果您能恰当地使用术语,尤其是在堆栈溢出方面,这将非常有帮助。感谢您纠正我的错误。如果我理解正确,池中的线程超过核心大小时,
keepAliveTime
才使用/有效。当池中的线程小于核心大小时,这不适用。终止线程的意义与首先拥有线程池的意义相同——不浪费不必要的资源。@Gnanam-以便线程可以执行另一个任务,所以节省了创建新线程的开销。@Gnanam:这当然也是我的理解。这并不是说它一定是正确的,但它至少是一致的:)@Prabhath:假设“等待网络呼叫”,你的意思是它正在进行网络呼叫并阻止它完成,那么不,它不是空闲的,而是阻塞。如果它空闲,可以给它另一个任务。如果它被封锁了,它就不可能被封锁。