天天看点

线程执行者(三)创建一个大小固定的线程执行者

创建一个大小固定的线程执行者

当你使用由executors类的 newcachedthreadpool()方法创建的基本threadpoolexecutor,你会有执行者运行在某一时刻的线程数的问题。这个执行者为每个接收到的任务创建一个线程(如果池中没有空闲的线程),所以,如果你提交大量的任务,并且它们有很长的(执行)时间,你会使系统过载和引发应用程序性能不佳的问题。

如果你想要避免这个问题,executors类提供一个方法来创建大小固定的线程执行者。这个执行者有最大线程数。 如果你提交超过这个最大线程数的任务,这个执行者将不会创建额外的线程,并且剩下的任务将会阻塞,直到执行者有空闲线程。这种行为,保证执行者不会引发应用程序性能不佳的问题。

在这个指南中,你将继续学习怎样创建一个大小固定的线程执行者,然后修改本章第一个示例的实现。

准备工作…

这个指南的例子使用eclipse ide实现。如果你使用eclipse或其他ide,如netbeans,打开它并创建一个新的java项目。

如何做…

按以下步骤来实现的这个例子:

1.实现本章第一个指南描述的示例,打开server类,修改它的构造器。使用newfixedthreadpool()方法创建执行者并传入5作为参数。

<code>1</code>

<code>public</code> <code>server(){</code>

<code>2</code>

<code>executor=(threadpoolexecutor)executors.newfixedthreadpool(</code><code>5</code><code>);</code>

<code>3</code>

<code>}</code>

2.修改executetask()方法,包含额外的日志信息行。调用gettaskcount()方法,获取已经提交给执行者的任务数。

<code>system.out.printf(&amp;quot;server: task count: %d\n&amp;quot;,executor.</code>

<code>gettaskcount());</code>

它是如何工作的…

在本例中,你已经使用executors类的newfixedthreadpool()方法来创建执行者。这个方法创建一个有最大线程数的执行者。如果你提交超过最大线程数的任务,剩下的任务将会被阻塞,直到有空闲的线程来处理它们。这个方法接收一个你想要让执行者拥有最大线程数的参数。在你的例子中,你已经创建了拥有5个线程的执行者。

以下截图展示了执行这个示例输出的一部分:

线程执行者(三)创建一个大小固定的线程执行者

写入的程序输出到控制台,你已经使用了threadpoolexecutor类的一些方法,包括:

getpoolsize():此方法返回线程池实际的线程数。

getactivecount():此方法返回在执行者中正在执行任务的线程数。

你可以看出这些方法的输出是5,表明执行者有5个线程。它本没有超出既定的最大线程数。

当你提交最后的任务给执行者,它只有5个活动的线程。剩下的95个任务将等待空闲线程。我们使用gettaskcount()方法来显示有多少个任务已经提交给执行者。

不止这些…

executors类同时提供newsinglethreadexecutor()方法。这是大小固定的线程执行者的一个极端例子。它创建只有一个线程的执行者,所以它在任意时刻只能执行一个任务。

参见

在第4章,线程执行者中的创建线程执行者指南

在第8章,测试并发应用程序中的监控executor framework指南

继续阅读