Java 轻量级、可折叠的执行器实现?

Java 轻量级、可折叠的执行器实现?,java,android,executorservice,executor,Java,Android,Executorservice,Executor,我正在为Android构建一个移动应用程序,我需要为我的每个列表适配器汇集HTTP请求。我基本上想要一个“崩溃”的ExecutorService实现,即:它将使用多达n个线程,但当线程完成时,它们将立即过期,使它变得非常轻量级。如果有高需求,它只会将任务转储到队列中,等待线程可用。有没有一种方法可以不用自己编写ExecutorService来执行此操作,或者我应该把手弄脏然后执行此操作?使用设置为零的a是否有效 e、 g int-core=5; int max=20; 新的ThreadPoolE

我正在为Android构建一个移动应用程序,我需要为我的每个列表适配器汇集HTTP请求。我基本上想要一个“崩溃”的
ExecutorService
实现,即:它将使用多达n个线程,但当线程完成时,它们将立即过期,使它变得非常轻量级。如果有高需求,它只会将任务转储到队列中,等待线程可用。有没有一种方法可以不用自己编写
ExecutorService
来执行此操作,或者我应该把手弄脏然后执行此操作?

使用设置为零的a是否有效

e、 g

int-core=5;
int max=20;
新的ThreadPoolExecutor(核心,最大值,0,TimeUnit.SECONDS,新的LinkedBlockingQueue())
setKeepAliveTime()的文档中:

时间值为零将导致多余线程在执行任务后立即终止

将a设置为零是否有效

e、 g

int-core=5;
int max=20;
新的ThreadPoolExecutor(核心,最大值,0,TimeUnit.SECONDS,新的LinkedBlockingQueue())
setKeepAliveTime()的文档中:

时间值为零将导致多余线程在执行任务后立即终止


Android没有提供类似于java.util.concurrent.ThreadPoolExecutor的执行器,这让我感到惊讶。请注意,编写一个好的线程安全执行器比看起来要困难得多——我知道,我是为Java 1.1编写的。现在没有人搜索文档了吗?我在google上为“Android Executor”做了一个简单的搜索,并在第一次点击文档时被带到了该文档,该文档直接链接到了各种执行器,包括ThreadPoolExecutor。Android没有提供类似于java.util.concurrent.ThreadPoolExecutor的执行器,这让我感到惊讶。请注意,编写一个好的线程安全执行器比看起来要困难得多——我知道,我是为Java 1.1编写的。现在没有人搜索文档了吗?我在谷歌上为“Android Executor”做了一个简单的搜索,并在第一次点击文档时被带到了各个Executor,包括ThreadPoolExecutor。太棒了,谢谢。所以像
new ThreadPoolExecutor(0,8,TimeUnit.SECONDS,new LinkedBlockingQueue())
这样的东西会给我一个最小大小为0,最大大小为8的池,并在线程完成后杀死它们?或者由于超时,第一个参数在这种情况下或多或少是不相关的?对于0和8,池最初将分配0个线程。当任务提交给执行器时,如果没有可用的线程,它将分配一个新线程来处理它。最多可以分配8个并发线程,在使用所有8个线程时提交的任何线程都将保留在队列中,直到执行器可用为止。我不确定的一点是,如果队列中有下一个任务可用,线程是否会在从队列中抓取下一个任务之前终止。在没有其他说明的文档的情况下,我倾向于相信它会的。无论如何,我不建议将核心池大小设置为0,同时将keepAliveTime设置为0。在我看来,您的线程将不断被终止/重构,这将否定您所追求的“轻量级”标准。我无法想象有几个核心线程在后台等待会使应用程序陷入困境。与任何性能问题一样,编写代码,然后分析应用程序,看看它是否按照您需要的方式运行。如果不是,refactor.FWIW:如果实现在队列上有任务时让线程死亡,我会感到震惊,仅创建另一个线程来接管死亡的线程-这将是一个非常困难的实现。保持活动时间记录为与空闲时间相关的:
如果多余线程的空闲时间超过keepAliveTime
,则会终止,这似乎可以防止线程在有任务挂起时死亡。然而,allowCoreThreadTimeout的文档似乎指出了相反的情况:
为了避免持续的线程替换,当设置为true时,保持活动时间必须大于零。太棒了,谢谢。所以像
new ThreadPoolExecutor(0,8,TimeUnit.SECONDS,new LinkedBlockingQueue())
这样的东西会给我一个最小大小为0,最大大小为8的池,并在线程完成后杀死它们?或者由于超时,第一个参数在这种情况下或多或少是不相关的?对于0和8,池最初将分配0个线程。当任务提交给执行器时,如果没有可用的线程,它将分配一个新线程来处理它。最多可以分配8个并发线程,在使用所有8个线程时提交的任何线程都将保留在队列中,直到执行器可用为止。我不确定的一点是,如果队列中有下一个任务可用,线程是否会在从队列中抓取下一个任务之前终止。在没有其他说明的文档的情况下,我倾向于相信它会的。无论如何,我不建议将核心池大小设置为0,同时将keepAliveTime设置为0。在我看来,您的线程将不断被终止/重构,这将否定您所追求的“轻量级”标准。我无法想象有几个核心线程在后台等待会使应用程序陷入困境。与任何性能问题一样,编写代码,然后分析应用程序,看看它是否按照您需要的方式运行。如果不是,refactor.FWIW:如果实现在队列上有任务时让线程死亡,我会感到震惊,仅创建另一个线程来接管死亡的线程-这将是一个非常困难的实现。保持活动时间记录为空闲时间:
如果多余的线程空闲更长时间,将终止它们
int core = 5;
int max = 20;
new ThreadPoolExecutor(core, max, 0, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>())