You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by gi...@apache.org on 2019/06/22 14:48:09 UTC

[hbase-site] branch asf-site updated: Published site at 9aee88e03a376702cad4f5e84acefafad2abf99c.

This is an automated email from the ASF dual-hosted git repository.

git-site-role pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/hbase-site.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 46710d6  Published site at 9aee88e03a376702cad4f5e84acefafad2abf99c.
46710d6 is described below

commit 46710d6d1adb9757e5c9a0c250e122691a44f961
Author: jenkins <bu...@apache.org>
AuthorDate: Sat Jun 22 14:47:58 2019 +0000

    Published site at 9aee88e03a376702cad4f5e84acefafad2abf99c.
---
 acid-semantics.html                                |   2 +-
 apache_hbase_reference_guide.pdf                   |   4 +-
 book.html                                          |   2 +-
 bulk-loads.html                                    |   2 +-
 checkstyle-aggregate.html                          |   2 +-
 coc.html                                           |   2 +-
 dependencies.html                                  |   2 +-
 dependency-convergence.html                        |   2 +-
 dependency-info.html                               |   2 +-
 dependency-management.html                         |   2 +-
 devapidocs/constant-values.html                    |   2 +-
 .../src-html/org/apache/hadoop/hbase/Version.html  |   2 +-
 downloads.html                                     |   2 +-
 export_control.html                                |   2 +-
 index.html                                         |   2 +-
 issue-management.html                              |   2 +-
 licenses.html                                      |   2 +-
 mailing-lists.html                                 |   2 +-
 metrics.html                                       |   2 +-
 old_news.html                                      |   2 +-
 plugin-management.html                             |   2 +-
 plugins.html                                       |   2 +-
 poweredbyhbase.html                                |   2 +-
 project-info.html                                  |   2 +-
 project-reports.html                               |   2 +-
 pseudo-distributed.html                            |   2 +-
 replication.html                                   |   2 +-
 resources.html                                     |   2 +-
 scm.html                                           |   2 +-
 sponsors.html                                      |   2 +-
 summary.html                                       |   2 +-
 supportingprojects.html                            |   2 +-
 team.html                                          |   2 +-
 .../org/apache/hadoop/hbase/TestChoreService.html  |  20 +-
 ...ervice.ScheduledChoreSamples.CountingChore.html | 878 +++++++++++----------
 ...rvice.ScheduledChoreSamples.DoNothingChore.html | 878 +++++++++++----------
 ...ice.ScheduledChoreSamples.FailInitialChore.html | 878 +++++++++++----------
 ...ervice.ScheduledChoreSamples.SampleStopper.html | 878 +++++++++++----------
 ...ervice.ScheduledChoreSamples.SleepingChore.html | 878 +++++++++++----------
 ...oreService.ScheduledChoreSamples.SlowChore.html | 878 +++++++++++----------
 .../TestChoreService.ScheduledChoreSamples.html    | 878 +++++++++++----------
 .../org/apache/hadoop/hbase/TestChoreService.html  | 878 +++++++++++----------
 42 files changed, 3564 insertions(+), 3548 deletions(-)

diff --git a/acid-semantics.html b/acid-semantics.html
index 57e1928..b2079f6 100644
--- a/acid-semantics.html
+++ b/acid-semantics.html
@@ -449,7 +449,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-21</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-22</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index 19d72cc..8c6379c 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
@@ -5,8 +5,8 @@
 /Author (Apache HBase Team)
 /Creator (Asciidoctor PDF 1.5.0.alpha.15, based on Prawn 2.2.2)
 /Producer (Apache HBase Team)
-/ModDate (D:20190621144520+00'00')
-/CreationDate (D:20190621144520+00'00')
+/ModDate (D:20190622144510+00'00')
+/CreationDate (D:20190622144510+00'00')
 >>
 endobj
 2 0 obj
diff --git a/book.html b/book.html
index 91216d1..52683d9 100644
--- a/book.html
+++ b/book.html
@@ -42114,7 +42114,7 @@ org/apache/hadoop/hbase/security/access/AccessControlClient.revoke:(Lorg/apache/
 <div id="footer">
 <div id="footer-text">
 Version 3.0.0-SNAPSHOT<br>
-Last updated 2019-06-21 14:29:41 UTC
+Last updated 2019-06-22 14:29:42 UTC
 </div>
 </div>
 </body>
diff --git a/bulk-loads.html b/bulk-loads.html
index c9337bd..84e8250 100644
--- a/bulk-loads.html
+++ b/bulk-loads.html
@@ -154,7 +154,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-21</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-22</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index 4436b97..91114b7 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -96096,7 +96096,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-21</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-22</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/coc.html b/coc.html
index deabee2..d4ca930 100644
--- a/coc.html
+++ b/coc.html
@@ -223,7 +223,7 @@ email to <a class="externalLink" href="mailto:private@hbase.apache.org">the priv
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-21</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-22</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependencies.html b/dependencies.html
index 55b7c7a..9e87dc6 100644
--- a/dependencies.html
+++ b/dependencies.html
@@ -303,7 +303,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-21</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-22</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependency-convergence.html b/dependency-convergence.html
index 4fe3d84..8e90d29 100644
--- a/dependency-convergence.html
+++ b/dependency-convergence.html
@@ -582,7 +582,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-21</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-22</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependency-info.html b/dependency-info.html
index 696eaa6..dd1c376 100644
--- a/dependency-info.html
+++ b/dependency-info.html
@@ -176,7 +176,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-21</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-22</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependency-management.html b/dependency-management.html
index 461a1d2..c75ac5b 100644
--- a/dependency-management.html
+++ b/dependency-management.html
@@ -892,7 +892,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-21</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-22</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index 0863548..4ae409e 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3927,7 +3927,7 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#date">date</a></code></td>
-<td class="colLast"><code>"Fri Jun 21 14:34:16 UTC 2019"</code></td>
+<td class="colLast"><code>"Sat Jun 22 14:34:17 UTC 2019"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.revision">
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
index 7ab8dde..230e58c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
@@ -18,7 +18,7 @@
 <span class="sourceLineNo">010</span>  public static final String version = "3.0.0-SNAPSHOT";<a name="line.10"></a>
 <span class="sourceLineNo">011</span>  public static final String revision = "Unknown";<a name="line.11"></a>
 <span class="sourceLineNo">012</span>  public static final String user = "jenkins";<a name="line.12"></a>
-<span class="sourceLineNo">013</span>  public static final String date = "Fri Jun 21 14:34:16 UTC 2019";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Sat Jun 22 14:34:17 UTC 2019";<a name="line.13"></a>
 <span class="sourceLineNo">014</span>  public static final String url = "file:///home/jenkins/jenkins-slave/workspace/hbase_generate_website/hbase";<a name="line.14"></a>
 <span class="sourceLineNo">015</span>  public static final String srcChecksum = "(stdin)=";<a name="line.15"></a>
 <span class="sourceLineNo">016</span>}<a name="line.16"></a>
diff --git a/downloads.html b/downloads.html
index 191e5be..34e4d8e 100644
--- a/downloads.html
+++ b/downloads.html
@@ -393,7 +393,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-21</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-22</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/export_control.html b/export_control.html
index 40a49ae..4785bed 100644
--- a/export_control.html
+++ b/export_control.html
@@ -179,7 +179,7 @@ for more details.</p>
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-21</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-22</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/index.html b/index.html
index b2dcf6d..46d5765 100644
--- a/index.html
+++ b/index.html
@@ -253,7 +253,7 @@ Apache HBase is an open-source, distributed, versioned, non-relational database
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-21</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-22</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/issue-management.html b/issue-management.html
index bfa5133..65dbfbe 100644
--- a/issue-management.html
+++ b/issue-management.html
@@ -151,7 +151,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-21</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-22</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/licenses.html b/licenses.html
index 6072b7b..d074781 100644
--- a/licenses.html
+++ b/licenses.html
@@ -354,7 +354,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-21</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-22</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/mailing-lists.html b/mailing-lists.html
index 606ee67..6fc61fb 100644
--- a/mailing-lists.html
+++ b/mailing-lists.html
@@ -204,7 +204,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-21</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-22</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/metrics.html b/metrics.html
index 5c66f5e..ef04765 100644
--- a/metrics.html
+++ b/metrics.html
@@ -307,7 +307,7 @@ export HBASE_REGIONSERVER_OPTS=&quot;$HBASE_JMX_OPTS -Dcom.sun.management.jmxrem
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-21</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-22</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/old_news.html b/old_news.html
index 910434c..42a7b3c 100644
--- a/old_news.html
+++ b/old_news.html
@@ -298,7 +298,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-21</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-22</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/plugin-management.html b/plugin-management.html
index c9d3a87..05116fa 100644
--- a/plugin-management.html
+++ b/plugin-management.html
@@ -303,7 +303,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-21</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-22</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/plugins.html b/plugins.html
index 2f748c0..9436607 100644
--- a/plugins.html
+++ b/plugins.html
@@ -230,7 +230,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-21</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-22</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index f15c54e..05f862f 100644
--- a/poweredbyhbase.html
+++ b/poweredbyhbase.html
@@ -617,7 +617,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-21</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-22</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/project-info.html b/project-info.html
index 02a1e9d..fc634d7 100644
--- a/project-info.html
+++ b/project-info.html
@@ -195,7 +195,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-21</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-22</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/project-reports.html b/project-reports.html
index 441246c..0c9d31f 100644
--- a/project-reports.html
+++ b/project-reports.html
@@ -168,7 +168,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-21</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-22</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/pseudo-distributed.html b/pseudo-distributed.html
index 44afb36..31aa8be 100644
--- a/pseudo-distributed.html
+++ b/pseudo-distributed.html
@@ -156,7 +156,7 @@ Running Apache HBase (TM) in pseudo-distributed mode
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-21</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-22</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/replication.html b/replication.html
index 8d1821f..54352e9 100644
--- a/replication.html
+++ b/replication.html
@@ -151,7 +151,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-21</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-22</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/resources.html b/resources.html
index e4985cd..d93b59b 100644
--- a/resources.html
+++ b/resources.html
@@ -179,7 +179,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-21</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-22</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/scm.html b/scm.html
index f7eb8e3..5f5dbae 100644
--- a/scm.html
+++ b/scm.html
@@ -162,7 +162,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-21</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-22</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/sponsors.html b/sponsors.html
index d9b2952..02b00be 100644
--- a/sponsors.html
+++ b/sponsors.html
@@ -181,7 +181,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-21</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-22</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/summary.html b/summary.html
index 4a45d52..d67a48c 100644
--- a/summary.html
+++ b/summary.html
@@ -194,7 +194,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-21</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-22</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/supportingprojects.html b/supportingprojects.html
index 02d4ec2..6faea1c 100644
--- a/supportingprojects.html
+++ b/supportingprojects.html
@@ -368,7 +368,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-21</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-22</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/team.html b/team.html
index 7d721c0..3edef5de 100644
--- a/team.html
+++ b/team.html
@@ -647,7 +647,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-21</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-06-22</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/TestChoreService.html b/testdevapidocs/org/apache/hadoop/hbase/TestChoreService.html
index 1033900..ccbcdff 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/TestChoreService.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/TestChoreService.html
@@ -425,7 +425,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCorePoolIncrease</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestChoreService.html#line.417">testCorePoolIncrease</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestChoreService.html#line.419">testCorePoolIncrease</a>()
                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -439,7 +439,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCorePoolDecrease</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestChoreService.html#line.457">testCorePoolDecrease</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestChoreService.html#line.459">testCorePoolDecrease</a>()
                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -453,7 +453,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testNumberOfRunningChores</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestChoreService.html#line.526">testNumberOfRunningChores</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestChoreService.html#line.528">testNumberOfRunningChores</a>()
                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -467,7 +467,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testNumberOfChoresMissingStartTime</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestChoreService.html#line.567">testNumberOfChoresMissingStartTime</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestChoreService.html#line.569">testNumberOfChoresMissingStartTime</a>()
                                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -481,7 +481,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testMaximumChoreServiceThreads</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestChoreService.html#line.615">testMaximumChoreServiceThreads</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestChoreService.html#line.617">testMaximumChoreServiceThreads</a>()
                                     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <div class="block">ChoreServices should never have a core pool size that exceeds the number of chores that have
  been scheduled with the service. For example, if 4 ScheduledChores are scheduled with a
@@ -498,7 +498,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testChangingChoreServices</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestChoreService.html#line.662">testChangingChoreServices</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestChoreService.html#line.664">testChangingChoreServices</a>()
                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -512,7 +512,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testStopperForScheduledChores</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestChoreService.html#line.701">testStopperForScheduledChores</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestChoreService.html#line.703">testStopperForScheduledChores</a>()
                                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -526,7 +526,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testShutdownCancelsScheduledChores</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestChoreService.html#line.756">testShutdownCancelsScheduledChores</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestChoreService.html#line.758">testShutdownCancelsScheduledChores</a>()
                                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -540,7 +540,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testShutdownWorksWhileChoresAreExecuting</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestChoreService.html#line.780">testShutdownWorksWhileChoresAreExecuting</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestChoreService.html#line.782">testShutdownWorksWhileChoresAreExecuting</a>()
                                               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -554,7 +554,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testShutdownRejectsNewSchedules</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestChoreService.html#line.808">testShutdownRejectsNewSchedules</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/TestChoreService.html#line.810">testShutdownRejectsNewSchedules</a>()
                                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.CountingChore.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.CountingChore.html
index 139ba2f..4fa763e 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.CountingChore.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.CountingChore.html
@@ -362,17 +362,17 @@
 <span class="sourceLineNo">354</span>  public void testFrequencyOfChores() throws InterruptedException {<a name="line.354"></a>
 <span class="sourceLineNo">355</span>    final int period = 100;<a name="line.355"></a>
 <span class="sourceLineNo">356</span>    // Small delta that acts as time buffer (allowing chores to complete if running slowly)<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    final int delta = 5;<a name="line.357"></a>
+<span class="sourceLineNo">357</span>    final int delta = period/5;<a name="line.357"></a>
 <span class="sourceLineNo">358</span>    ChoreService service = new ChoreService("testFrequencyOfChores");<a name="line.358"></a>
 <span class="sourceLineNo">359</span>    CountingChore chore = new CountingChore("countingChore", period);<a name="line.359"></a>
 <span class="sourceLineNo">360</span>    try {<a name="line.360"></a>
 <span class="sourceLineNo">361</span>      service.scheduleChore(chore);<a name="line.361"></a>
 <span class="sourceLineNo">362</span><a name="line.362"></a>
 <span class="sourceLineNo">363</span>      Thread.sleep(10 * period + delta);<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      assertTrue(chore.getCountOfChoreCalls() == 11);<a name="line.364"></a>
+<span class="sourceLineNo">364</span>      assertEquals("10 periods have elapsed.", 11, chore.getCountOfChoreCalls());<a name="line.364"></a>
 <span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>      Thread.sleep(10 * period);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      assertTrue(chore.getCountOfChoreCalls() == 21);<a name="line.367"></a>
+<span class="sourceLineNo">366</span>      Thread.sleep(10 * period + delta);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      assertEquals("20 periods have elapsed.", 21, chore.getCountOfChoreCalls());<a name="line.367"></a>
 <span class="sourceLineNo">368</span>    } finally {<a name="line.368"></a>
 <span class="sourceLineNo">369</span>      shutdownService(service);<a name="line.369"></a>
 <span class="sourceLineNo">370</span>    }<a name="line.370"></a>
@@ -388,14 +388,14 @@
 <span class="sourceLineNo">380</span>  @Test<a name="line.380"></a>
 <span class="sourceLineNo">381</span>  public void testForceTrigger() throws InterruptedException {<a name="line.381"></a>
 <span class="sourceLineNo">382</span>    final int period = 100;<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    final int delta = 10;<a name="line.383"></a>
+<span class="sourceLineNo">383</span>    final int delta = period/10;<a name="line.383"></a>
 <span class="sourceLineNo">384</span>    ChoreService service = new ChoreService("testForceTrigger");<a name="line.384"></a>
 <span class="sourceLineNo">385</span>    final CountingChore chore = new CountingChore("countingChore", period);<a name="line.385"></a>
 <span class="sourceLineNo">386</span>    try {<a name="line.386"></a>
 <span class="sourceLineNo">387</span>      service.scheduleChore(chore);<a name="line.387"></a>
 <span class="sourceLineNo">388</span>      Thread.sleep(10 * period + delta);<a name="line.388"></a>
 <span class="sourceLineNo">389</span><a name="line.389"></a>
-<span class="sourceLineNo">390</span>      assertTrue(chore.getCountOfChoreCalls() == 11);<a name="line.390"></a>
+<span class="sourceLineNo">390</span>      assertEquals("10 periods have elapsed.", 11, chore.getCountOfChoreCalls());<a name="line.390"></a>
 <span class="sourceLineNo">391</span><a name="line.391"></a>
 <span class="sourceLineNo">392</span>      // Force five runs of the chore to occur, sleeping between triggers to ensure the<a name="line.392"></a>
 <span class="sourceLineNo">393</span>      // chore has time to run<a name="line.393"></a>
@@ -410,438 +410,440 @@
 <span class="sourceLineNo">402</span>      chore.triggerNow();<a name="line.402"></a>
 <span class="sourceLineNo">403</span>      Thread.sleep(delta);<a name="line.403"></a>
 <span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>      assertTrue("" + chore.getCountOfChoreCalls(), chore.getCountOfChoreCalls() == 16);<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>      Thread.sleep(10 * period + delta);<a name="line.407"></a>
-<span class="sourceLineNo">408</span><a name="line.408"></a>
-<span class="sourceLineNo">409</span>      // Be loosey-goosey. It used to be '26' but it was a big flakey relying on timing.<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      assertTrue("" + chore.getCountOfChoreCalls(), chore.getCountOfChoreCalls() &gt; 16);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    } finally {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      shutdownService(service);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  @Test<a name="line.416"></a>
-<span class="sourceLineNo">417</span>  public void testCorePoolIncrease() throws InterruptedException {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    final int initialCorePoolSize = 3;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    ChoreService service = new ChoreService("testCorePoolIncrease", initialCorePoolSize, false);<a name="line.419"></a>
-<span class="sourceLineNo">420</span><a name="line.420"></a>
-<span class="sourceLineNo">421</span>    try {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      assertEquals("Should have a core pool of size: " + initialCorePoolSize, initialCorePoolSize,<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        service.getCorePoolSize());<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>      final int slowChorePeriod = 100;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      SlowChore slowChore1 = new SlowChore("slowChore1", slowChorePeriod);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      SlowChore slowChore2 = new SlowChore("slowChore2", slowChorePeriod);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      SlowChore slowChore3 = new SlowChore("slowChore3", slowChorePeriod);<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>      service.scheduleChore(slowChore1);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      service.scheduleChore(slowChore2);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      service.scheduleChore(slowChore3);<a name="line.432"></a>
-<span class="sourceLineNo">433</span><a name="line.433"></a>
-<span class="sourceLineNo">434</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      assertEquals("Should not create more pools than scheduled chores", 3,<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        service.getCorePoolSize());<a name="line.436"></a>
-<span class="sourceLineNo">437</span><a name="line.437"></a>
-<span class="sourceLineNo">438</span>      SlowChore slowChore4 = new SlowChore("slowChore4", slowChorePeriod);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      service.scheduleChore(slowChore4);<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 4,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        service.getCorePoolSize());<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>      SlowChore slowChore5 = new SlowChore("slowChore5", slowChorePeriod);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      service.scheduleChore(slowChore5);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 5,<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        service.getCorePoolSize());<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    } finally {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      shutdownService(service);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>  @Test<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  public void testCorePoolDecrease() throws InterruptedException {<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    final int initialCorePoolSize = 3;<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    ChoreService service = new ChoreService("testCorePoolDecrease", initialCorePoolSize, false);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    final int chorePeriod = 100;<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    try {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      // Slow chores always miss their start time and thus the core pool size should be at least as<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      // large as the number of running slow chores<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      SlowChore slowChore1 = new SlowChore("slowChore1", chorePeriod);<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      SlowChore slowChore2 = new SlowChore("slowChore2", chorePeriod);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      SlowChore slowChore3 = new SlowChore("slowChore3", chorePeriod);<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>      service.scheduleChore(slowChore1);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      service.scheduleChore(slowChore2);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      service.scheduleChore(slowChore3);<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>      Thread.sleep(chorePeriod * 10);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      assertEquals("Should not create more pools than scheduled chores",<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.474"></a>
-<span class="sourceLineNo">475</span><a name="line.475"></a>
-<span class="sourceLineNo">476</span>      SlowChore slowChore4 = new SlowChore("slowChore4", chorePeriod);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      service.scheduleChore(slowChore4);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      Thread.sleep(chorePeriod * 10);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>      SlowChore slowChore5 = new SlowChore("slowChore5", chorePeriod);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      service.scheduleChore(slowChore5);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      Thread.sleep(chorePeriod * 10);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.485"></a>
-<span class="sourceLineNo">486</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.487"></a>
-<span class="sourceLineNo">488</span><a name="line.488"></a>
-<span class="sourceLineNo">489</span>      // Now we begin to cancel the chores that caused an increase in the core thread pool of the<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      // ChoreService. These cancellations should cause a decrease in the core thread pool.<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      slowChore5.cancel();<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      Thread.sleep(chorePeriod * 10);<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        service.getCorePoolSize());<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>      slowChore4.cancel();<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      Thread.sleep(chorePeriod * 10);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        service.getCorePoolSize());<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      assertEquals(3, service.getNumberOfChoresMissingStartTime());<a name="line.501"></a>
-<span class="sourceLineNo">502</span><a name="line.502"></a>
-<span class="sourceLineNo">503</span>      slowChore3.cancel();<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      Thread.sleep(chorePeriod * 10);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.505"></a>
-<span class="sourceLineNo">506</span>        service.getCorePoolSize());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      assertEquals(2, service.getNumberOfChoresMissingStartTime());<a name="line.507"></a>
-<span class="sourceLineNo">508</span><a name="line.508"></a>
-<span class="sourceLineNo">509</span>      slowChore2.cancel();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      Thread.sleep(chorePeriod * 10);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.511"></a>
-<span class="sourceLineNo">512</span>        service.getCorePoolSize());<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>      slowChore1.cancel();<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      Thread.sleep(chorePeriod * 10);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.517"></a>
-<span class="sourceLineNo">518</span>        service.getCorePoolSize());<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    } finally {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      shutdownService(service);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>  }<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>  @Test<a name="line.525"></a>
-<span class="sourceLineNo">526</span>  public void testNumberOfRunningChores() throws InterruptedException {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    ChoreService service = new ChoreService("testNumberOfRunningChores");<a name="line.527"></a>
-<span class="sourceLineNo">528</span><a name="line.528"></a>
-<span class="sourceLineNo">529</span>    final int period = 100;<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    final int sleepTime = 5;<a name="line.530"></a>
-<span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>    try {<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      DoNothingChore dn1 = new DoNothingChore("dn1", period);<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      DoNothingChore dn2 = new DoNothingChore("dn2", period);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      DoNothingChore dn3 = new DoNothingChore("dn3", period);<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      DoNothingChore dn4 = new DoNothingChore("dn4", period);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      DoNothingChore dn5 = new DoNothingChore("dn5", period);<a name="line.537"></a>
-<span class="sourceLineNo">538</span><a name="line.538"></a>
-<span class="sourceLineNo">539</span>      service.scheduleChore(dn1);<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      service.scheduleChore(dn2);<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      service.scheduleChore(dn3);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      service.scheduleChore(dn4);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      service.scheduleChore(dn5);<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>      Thread.sleep(sleepTime);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      assertEquals("Scheduled chore mismatch", 5, service.getNumberOfScheduledChores());<a name="line.546"></a>
-<span class="sourceLineNo">547</span><a name="line.547"></a>
-<span class="sourceLineNo">548</span>      dn1.cancel();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      Thread.sleep(sleepTime);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      assertEquals("Scheduled chore mismatch", 4, service.getNumberOfScheduledChores());<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>      dn2.cancel();<a name="line.552"></a>
-<span class="sourceLineNo">553</span>      dn3.cancel();<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      dn4.cancel();<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      Thread.sleep(sleepTime);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      assertEquals("Scheduled chore mismatch", 1, service.getNumberOfScheduledChores());<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>      dn5.cancel();<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      Thread.sleep(sleepTime);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      assertEquals("Scheduled chore mismatch", 0, service.getNumberOfScheduledChores());<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    } finally {<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      shutdownService(service);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    }<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  }<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>  @Test<a name="line.566"></a>
-<span class="sourceLineNo">567</span>  public void testNumberOfChoresMissingStartTime() throws InterruptedException {<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    ChoreService service = new ChoreService("testNumberOfChoresMissingStartTime");<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>    final int period = 100;<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    final int sleepTime = 5 * period;<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    try {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      // ALWAYS miss their start time since their execution takes longer than their period<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.580"></a>
-<span class="sourceLineNo">581</span><a name="line.581"></a>
-<span class="sourceLineNo">582</span>      service.scheduleChore(sc1);<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      service.scheduleChore(sc2);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      service.scheduleChore(sc3);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      service.scheduleChore(sc4);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      service.scheduleChore(sc5);<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>      Thread.sleep(sleepTime);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.589"></a>
-<span class="sourceLineNo">590</span><a name="line.590"></a>
-<span class="sourceLineNo">591</span>      sc1.cancel();<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      Thread.sleep(sleepTime);<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.593"></a>
-<span class="sourceLineNo">594</span><a name="line.594"></a>
-<span class="sourceLineNo">595</span>      sc2.cancel();<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      sc3.cancel();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      sc4.cancel();<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      Thread.sleep(sleepTime);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>      sc5.cancel();<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      Thread.sleep(sleepTime);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    } finally {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      shutdownService(service);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  }<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>  /**<a name="line.609"></a>
-<span class="sourceLineNo">610</span>   * ChoreServices should never have a core pool size that exceeds the number of chores that have<a name="line.610"></a>
-<span class="sourceLineNo">611</span>   * been scheduled with the service. For example, if 4 ScheduledChores are scheduled with a<a name="line.611"></a>
-<span class="sourceLineNo">612</span>   * ChoreService, the number of threads in the ChoreService's core pool should never exceed 4<a name="line.612"></a>
-<span class="sourceLineNo">613</span>   */<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  @Test<a name="line.614"></a>
-<span class="sourceLineNo">615</span>  public void testMaximumChoreServiceThreads() throws InterruptedException {<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    ChoreService service = new ChoreService("testMaximumChoreServiceThreads");<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>    final int period = 100;<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    final int sleepTime = 5 * period;<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>    try {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.622"></a>
-<span class="sourceLineNo">623</span>      // ALWAYS miss their start time since their execution takes longer than their period.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      // Chores that miss their start time will trigger the onChoreMissedStartTime callback<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      // in the ChoreService. This callback will try to increase the number of core pool<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      // threads.<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.628"></a>
-<span class="sourceLineNo">629</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.631"></a>
-<span class="sourceLineNo">632</span><a name="line.632"></a>
-<span class="sourceLineNo">633</span>      service.scheduleChore(sc1);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      service.scheduleChore(sc2);<a name="line.634"></a>
-<span class="sourceLineNo">635</span>      service.scheduleChore(sc3);<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      service.scheduleChore(sc4);<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      service.scheduleChore(sc5);<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>      Thread.sleep(sleepTime);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>      SlowChore sc6 = new SlowChore("sc6", period);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      SlowChore sc7 = new SlowChore("sc7", period);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      SlowChore sc8 = new SlowChore("sc8", period);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      SlowChore sc9 = new SlowChore("sc9", period);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      SlowChore sc10 = new SlowChore("sc10", period);<a name="line.646"></a>
-<span class="sourceLineNo">647</span><a name="line.647"></a>
-<span class="sourceLineNo">648</span>      service.scheduleChore(sc6);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      service.scheduleChore(sc7);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      service.scheduleChore(sc8);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      service.scheduleChore(sc9);<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      service.scheduleChore(sc10);<a name="line.652"></a>
-<span class="sourceLineNo">653</span><a name="line.653"></a>
-<span class="sourceLineNo">654</span>      Thread.sleep(sleepTime);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    } finally {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      shutdownService(service);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    }<a name="line.658"></a>
-<span class="sourceLineNo">659</span>  }<a name="line.659"></a>
-<span class="sourceLineNo">660</span><a name="line.660"></a>
-<span class="sourceLineNo">661</span>  @Test<a name="line.661"></a>
-<span class="sourceLineNo">662</span>  public void testChangingChoreServices() throws InterruptedException {<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    final int period = 100;<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    final int sleepTime = 10;<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    ChoreService service1 = new ChoreService("testChangingChoreServices_1");<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    ChoreService service2 = new ChoreService("testChangingChoreServices_2");<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    ScheduledChore chore = new DoNothingChore("sample", period);<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    try {<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      assertFalse(chore.isScheduled());<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.673"></a>
-<span class="sourceLineNo">674</span><a name="line.674"></a>
-<span class="sourceLineNo">675</span>      service1.scheduleChore(chore);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      Thread.sleep(sleepTime);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      assertTrue(chore.isScheduled());<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      assertTrue(service1.isChoreScheduled(chore));<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>      service2.scheduleChore(chore);<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      Thread.sleep(sleepTime);<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      assertTrue(chore.isScheduled());<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      assertTrue(service2.isChoreScheduled(chore));<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.687"></a>
-<span class="sourceLineNo">688</span><a name="line.688"></a>
-<span class="sourceLineNo">689</span>      chore.cancel();<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      assertFalse(chore.isScheduled());<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    } finally {<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      shutdownService(service1);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      shutdownService(service2);<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span>  }<a name="line.698"></a>
-<span class="sourceLineNo">699</span><a name="line.699"></a>
-<span class="sourceLineNo">700</span>  @Test<a name="line.700"></a>
-<span class="sourceLineNo">701</span>  public void testStopperForScheduledChores() throws InterruptedException {<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    ChoreService service = new ChoreService("testStopperForScheduledChores");<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    Stoppable stopperForGroup1 = new SampleStopper();<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    Stoppable stopperForGroup2 = new SampleStopper();<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    final int period = 100;<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    final int delta = 10;<a name="line.706"></a>
-<span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    try {<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      ScheduledChore chore1_group1 = new DoNothingChore("c1g1", stopperForGroup1, period);<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      ScheduledChore chore2_group1 = new DoNothingChore("c2g1", stopperForGroup1, period);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      ScheduledChore chore3_group1 = new DoNothingChore("c3g1", stopperForGroup1, period);<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      ScheduledChore chore1_group2 = new DoNothingChore("c1g2", stopperForGroup2, period);<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      ScheduledChore chore2_group2 = new DoNothingChore("c2g2", stopperForGroup2, period);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      ScheduledChore chore3_group2 = new DoNothingChore("c3g2", stopperForGroup2, period);<a name="line.715"></a>
-<span class="sourceLineNo">716</span><a name="line.716"></a>
-<span class="sourceLineNo">717</span>      service.scheduleChore(chore1_group1);<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      service.scheduleChore(chore2_group1);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      service.scheduleChore(chore3_group1);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      service.scheduleChore(chore1_group2);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      service.scheduleChore(chore2_group2);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      service.scheduleChore(chore3_group2);<a name="line.722"></a>
-<span class="sourceLineNo">723</span><a name="line.723"></a>
-<span class="sourceLineNo">724</span>      Thread.sleep(delta);<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      Thread.sleep(10 * period);<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      assertTrue(chore1_group1.isScheduled());<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      assertTrue(chore2_group1.isScheduled());<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      assertTrue(chore3_group1.isScheduled());<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      assertTrue(chore1_group2.isScheduled());<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      assertTrue(chore2_group2.isScheduled());<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      assertTrue(chore3_group2.isScheduled());<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>      stopperForGroup1.stop("test stopping group 1");<a name="line.733"></a>
-<span class="sourceLineNo">734</span>      Thread.sleep(period);<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      assertFalse(chore1_group1.isScheduled());<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      assertFalse(chore2_group1.isScheduled());<a name="line.736"></a>
-<span class="sourceLineNo">737</span>      assertFalse(chore3_group1.isScheduled());<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      assertTrue(chore1_group2.isScheduled());<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      assertTrue(chore2_group2.isScheduled());<a name="line.739"></a>
-<span class="sourceLineNo">740</span>      assertTrue(chore3_group2.isScheduled());<a name="line.740"></a>
-<span class="sourceLineNo">741</span><a name="line.741"></a>
-<span class="sourceLineNo">742</span>      stopperForGroup2.stop("test stopping group 2");<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      Thread.sleep(period);<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      assertFalse(chore1_group1.isScheduled());<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      assertFalse(chore2_group1.isScheduled());<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      assertFalse(chore3_group1.isScheduled());<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      assertFalse(chore1_group2.isScheduled());<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      assertFalse(chore2_group2.isScheduled());<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      assertFalse(chore3_group2.isScheduled());<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    } finally {<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      shutdownService(service);<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    }<a name="line.752"></a>
-<span class="sourceLineNo">753</span>  }<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>  @Test<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public void testShutdownCancelsScheduledChores() throws InterruptedException {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>    final int period = 100;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    ChoreService service = new ChoreService("testShutdownCancelsScheduledChores");<a name="line.758"></a>
-<span class="sourceLineNo">759</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.761"></a>
-<span class="sourceLineNo">762</span><a name="line.762"></a>
-<span class="sourceLineNo">763</span>    try {<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      assertTrue(successChore1.isScheduled());<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.766"></a>
-<span class="sourceLineNo">767</span>      assertTrue(successChore2.isScheduled());<a name="line.767"></a>
-<span class="sourceLineNo">768</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      assertTrue(successChore3.isScheduled());<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    } finally {<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      shutdownService(service);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    }<a name="line.772"></a>
-<span class="sourceLineNo">773</span><a name="line.773"></a>
-<span class="sourceLineNo">774</span>    assertFalse(successChore1.isScheduled());<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    assertFalse(successChore2.isScheduled());<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    assertFalse(successChore3.isScheduled());<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  @Test<a name="line.779"></a>
-<span class="sourceLineNo">780</span>  public void testShutdownWorksWhileChoresAreExecuting() throws InterruptedException {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    final int period = 100;<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    final int sleep = 5 * period;<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    ChoreService service = new ChoreService("testShutdownWorksWhileChoresAreExecuting");<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    ScheduledChore slowChore1 = new SleepingChore("sc1", period, sleep);<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    ScheduledChore slowChore2 = new SleepingChore("sc2", period, sleep);<a name="line.785"></a>
-<span class="sourceLineNo">786</span>    ScheduledChore slowChore3 = new SleepingChore("sc3", period, sleep);<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    try {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      assertTrue(service.scheduleChore(slowChore1));<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      assertTrue(service.scheduleChore(slowChore2));<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      assertTrue(service.scheduleChore(slowChore3));<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>      Thread.sleep(sleep / 2);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>      shutdownService(service);<a name="line.793"></a>
-<span class="sourceLineNo">794</span><a name="line.794"></a>
-<span class="sourceLineNo">795</span>      assertFalse(slowChore1.isScheduled());<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      assertFalse(slowChore2.isScheduled());<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      assertFalse(slowChore3.isScheduled());<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      assertTrue(service.isShutdown());<a name="line.798"></a>
-<span class="sourceLineNo">799</span><a name="line.799"></a>
-<span class="sourceLineNo">800</span>      Thread.sleep(5);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      assertTrue(service.isTerminated());<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    } finally {<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      shutdownService(service);<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    }<a name="line.804"></a>
-<span class="sourceLineNo">805</span>  }<a name="line.805"></a>
-<span class="sourceLineNo">806</span><a name="line.806"></a>
-<span class="sourceLineNo">807</span>  @Test<a name="line.807"></a>
-<span class="sourceLineNo">808</span>  public void testShutdownRejectsNewSchedules() throws InterruptedException {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    final int period = 100;<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    ChoreService service = new ChoreService("testShutdownRejectsNewSchedules");<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    ScheduledChore failChore1 = new DoNothingChore("fc1", period);<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    ScheduledChore failChore2 = new DoNothingChore("fc2", period);<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    ScheduledChore failChore3 = new DoNothingChore("fc3", period);<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>    try {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.819"></a>
-<span class="sourceLineNo">820</span>      assertTrue(successChore1.isScheduled());<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      assertTrue(successChore2.isScheduled());<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      assertTrue(successChore3.isScheduled());<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    } finally {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      shutdownService(service);<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>    assertFalse(service.scheduleChore(failChore1));<a name="line.829"></a>
-<span class="sourceLineNo">830</span>    assertFalse(failChore1.isScheduled());<a name="line.830"></a>
-<span class="sourceLineNo">831</span>    assertFalse(service.scheduleChore(failChore2));<a name="line.831"></a>
-<span class="sourceLineNo">832</span>    assertFalse(failChore2.isScheduled());<a name="line.832"></a>
-<span class="sourceLineNo">833</span>    assertFalse(service.scheduleChore(failChore3));<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    assertFalse(failChore3.isScheduled());<a name="line.834"></a>
-<span class="sourceLineNo">835</span>  }<a name="line.835"></a>
-<span class="sourceLineNo">836</span>}<a name="line.836"></a>
+<span class="sourceLineNo">405</span>      assertEquals("Trigger was called 5 times after 10 periods.", 16,<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          chore.getCountOfChoreCalls());<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>      Thread.sleep(10 * period + delta);<a name="line.408"></a>
+<span class="sourceLineNo">409</span><a name="line.409"></a>
+<span class="sourceLineNo">410</span>      // Be loosey-goosey. It used to be '26' but it was a big flakey relying on timing.<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      assertTrue("Expected at least 16 invocations, instead got " + chore.getCountOfChoreCalls(),<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          chore.getCountOfChoreCalls() &gt; 16);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    } finally {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      shutdownService(service);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    }<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  }<a name="line.416"></a>
+<span class="sourceLineNo">417</span><a name="line.417"></a>
+<span class="sourceLineNo">418</span>  @Test<a name="line.418"></a>
+<span class="sourceLineNo">419</span>  public void testCorePoolIncrease() throws InterruptedException {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    final int initialCorePoolSize = 3;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    ChoreService service = new ChoreService("testCorePoolIncrease", initialCorePoolSize, false);<a name="line.421"></a>
+<span class="sourceLineNo">422</span><a name="line.422"></a>
+<span class="sourceLineNo">423</span>    try {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>      assertEquals("Setting core pool size gave unexpected results.", initialCorePoolSize,<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        service.getCorePoolSize());<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>      final int slowChorePeriod = 100;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      SlowChore slowChore1 = new SlowChore("slowChore1", slowChorePeriod);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      SlowChore slowChore2 = new SlowChore("slowChore2", slowChorePeriod);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>      SlowChore slowChore3 = new SlowChore("slowChore3", slowChorePeriod);<a name="line.430"></a>
+<span class="sourceLineNo">431</span><a name="line.431"></a>
+<span class="sourceLineNo">432</span>      service.scheduleChore(slowChore1);<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      service.scheduleChore(slowChore2);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      service.scheduleChore(slowChore3);<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      assertEquals("Should not create more pools than scheduled chores", 3,<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        service.getCorePoolSize());<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>      SlowChore slowChore4 = new SlowChore("slowChore4", slowChorePeriod);<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      service.scheduleChore(slowChore4);<a name="line.441"></a>
+<span class="sourceLineNo">442</span><a name="line.442"></a>
+<span class="sourceLineNo">443</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 4,<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        service.getCorePoolSize());<a name="line.445"></a>
+<span class="sourceLineNo">446</span><a name="line.446"></a>
+<span class="sourceLineNo">447</span>      SlowChore slowChore5 = new SlowChore("slowChore5", slowChorePeriod);<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      service.scheduleChore(slowChore5);<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 5,<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        service.getCorePoolSize());<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    } finally {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      shutdownService(service);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
+<span class="sourceLineNo">457</span><a name="line.457"></a>
+<span class="sourceLineNo">458</span>  @Test<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  public void testCorePoolDecrease() throws InterruptedException {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    final int initialCorePoolSize = 3;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    ChoreService service = new ChoreService("testCorePoolDecrease", initialCorePoolSize, false);<a name="line.461"></a>
+<span class="sourceLineNo">462</span>    final int chorePeriod = 100;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    try {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>      // Slow chores always miss their start time and thus the core pool size should be at least as<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      // large as the number of running slow chores<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      SlowChore slowChore1 = new SlowChore("slowChore1", chorePeriod);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      SlowChore slowChore2 = new SlowChore("slowChore2", chorePeriod);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      SlowChore slowChore3 = new SlowChore("slowChore3", chorePeriod);<a name="line.468"></a>
+<span class="sourceLineNo">469</span><a name="line.469"></a>
+<span class="sourceLineNo">470</span>      service.scheduleChore(slowChore1);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      service.scheduleChore(slowChore2);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>      service.scheduleChore(slowChore3);<a name="line.472"></a>
+<span class="sourceLineNo">473</span><a name="line.473"></a>
+<span class="sourceLineNo">474</span>      Thread.sleep(chorePeriod * 10);<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      assertEquals("Should not create more pools than scheduled chores",<a name="line.475"></a>
+<span class="sourceLineNo">476</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>      SlowChore slowChore4 = new SlowChore("slowChore4", chorePeriod);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      service.scheduleChore(slowChore4);<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      Thread.sleep(chorePeriod * 10);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.481"></a>
+<span class="sourceLineNo">482</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>      SlowChore slowChore5 = new SlowChore("slowChore5", chorePeriod);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      service.scheduleChore(slowChore5);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      Thread.sleep(chorePeriod * 10);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.487"></a>
+<span class="sourceLineNo">488</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>      // Now we begin to cancel the chores that caused an increase in the core thread pool of the<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      // ChoreService. These cancellations should cause a decrease in the core thread pool.<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      slowChore5.cancel();<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      Thread.sleep(chorePeriod * 10);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.495"></a>
+<span class="sourceLineNo">496</span>        service.getCorePoolSize());<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.497"></a>
+<span class="sourceLineNo">498</span><a name="line.498"></a>
+<span class="sourceLineNo">499</span>      slowChore4.cancel();<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      Thread.sleep(chorePeriod * 10);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        service.getCorePoolSize());<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      assertEquals(3, service.getNumberOfChoresMissingStartTime());<a name="line.503"></a>
+<span class="sourceLineNo">504</span><a name="line.504"></a>
+<span class="sourceLineNo">505</span>      slowChore3.cancel();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      Thread.sleep(chorePeriod * 10);<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        service.getCorePoolSize());<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      assertEquals(2, service.getNumberOfChoresMissingStartTime());<a name="line.509"></a>
+<span class="sourceLineNo">510</span><a name="line.510"></a>
+<span class="sourceLineNo">511</span>      slowChore2.cancel();<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      Thread.sleep(chorePeriod * 10);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.513"></a>
+<span class="sourceLineNo">514</span>        service.getCorePoolSize());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.515"></a>
+<span class="sourceLineNo">516</span><a name="line.516"></a>
+<span class="sourceLineNo">517</span>      slowChore1.cancel();<a name="line.517"></a>
+<span class="sourceLineNo">518</span>      Thread.sleep(chorePeriod * 10);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.519"></a>
+<span class="sourceLineNo">520</span>        service.getCorePoolSize());<a name="line.520"></a>
+<span class="sourceLineNo">521</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    } finally {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      shutdownService(service);<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
+<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>  @Test<a name="line.527"></a>
+<span class="sourceLineNo">528</span>  public void testNumberOfRunningChores() throws InterruptedException {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    ChoreService service = new ChoreService("testNumberOfRunningChores");<a name="line.529"></a>
+<span class="sourceLineNo">530</span><a name="line.530"></a>
+<span class="sourceLineNo">531</span>    final int period = 100;<a name="line.531"></a>
+<span class="sourceLineNo">532</span>    final int sleepTime = 5;<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>    try {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      DoNothingChore dn1 = new DoNothingChore("dn1", period);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      DoNothingChore dn2 = new DoNothingChore("dn2", period);<a name="line.536"></a>
+<span class="sourceLineNo">537</span>      DoNothingChore dn3 = new DoNothingChore("dn3", period);<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      DoNothingChore dn4 = new DoNothingChore("dn4", period);<a name="line.538"></a>
+<span class="sourceLineNo">539</span>      DoNothingChore dn5 = new DoNothingChore("dn5", period);<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>      service.scheduleChore(dn1);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      service.scheduleChore(dn2);<a name="line.542"></a>
+<span class="sourceLineNo">543</span>      service.scheduleChore(dn3);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>      service.scheduleChore(dn4);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      service.scheduleChore(dn5);<a name="line.545"></a>
+<span class="sourceLineNo">546</span><a name="line.546"></a>
+<span class="sourceLineNo">547</span>      Thread.sleep(sleepTime);<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      assertEquals("Scheduled chore mismatch", 5, service.getNumberOfScheduledChores());<a name="line.548"></a>
+<span class="sourceLineNo">549</span><a name="line.549"></a>
+<span class="sourceLineNo">550</span>      dn1.cancel();<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      Thread.sleep(sleepTime);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      assertEquals("Scheduled chore mismatch", 4, service.getNumberOfScheduledChores());<a name="line.552"></a>
+<span class="sourceLineNo">553</span><a name="line.553"></a>
+<span class="sourceLineNo">554</span>      dn2.cancel();<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      dn3.cancel();<a name="line.555"></a>
+<span class="sourceLineNo">556</span>      dn4.cancel();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>      Thread.sleep(sleepTime);<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      assertEquals("Scheduled chore mismatch", 1, service.getNumberOfScheduledChores());<a name="line.558"></a>
+<span class="sourceLineNo">559</span><a name="line.559"></a>
+<span class="sourceLineNo">560</span>      dn5.cancel();<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      Thread.sleep(sleepTime);<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      assertEquals("Scheduled chore mismatch", 0, service.getNumberOfScheduledChores());<a name="line.562"></a>
+<span class="sourceLineNo">563</span>    } finally {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      shutdownService(service);<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    }<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  @Test<a name="line.568"></a>
+<span class="sourceLineNo">569</span>  public void testNumberOfChoresMissingStartTime() throws InterruptedException {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    ChoreService service = new ChoreService("testNumberOfChoresMissingStartTime");<a name="line.570"></a>
+<span class="sourceLineNo">571</span><a name="line.571"></a>
+<span class="sourceLineNo">572</span>    final int period = 100;<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    final int sleepTime = 5 * period;<a name="line.573"></a>
+<span class="sourceLineNo">574</span><a name="line.574"></a>
+<span class="sourceLineNo">575</span>    try {<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      // ALWAYS miss their start time since their execution takes longer than their period<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.578"></a>
+<span class="sourceLineNo">579</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.581"></a>
+<span class="sourceLineNo">582</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.582"></a>
+<span class="sourceLineNo">583</span><a name="line.583"></a>
+<span class="sourceLineNo">584</span>      service.scheduleChore(sc1);<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      service.scheduleChore(sc2);<a name="line.585"></a>
+<span class="sourceLineNo">586</span>      service.scheduleChore(sc3);<a name="line.586"></a>
+<span class="sourceLineNo">587</span>      service.scheduleChore(sc4);<a name="line.587"></a>
+<span class="sourceLineNo">588</span>      service.scheduleChore(sc5);<a name="line.588"></a>
+<span class="sourceLineNo">589</span><a name="line.589"></a>
+<span class="sourceLineNo">590</span>      Thread.sleep(sleepTime);<a name="line.590"></a>
+<span class="sourceLineNo">591</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.591"></a>
+<span class="sourceLineNo">592</span><a name="line.592"></a>
+<span class="sourceLineNo">593</span>      sc1.cancel();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>      Thread.sleep(sleepTime);<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>      sc2.cancel();<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      sc3.cancel();<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      sc4.cancel();<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      Thread.sleep(sleepTime);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.601"></a>
+<span class="sourceLineNo">602</span><a name="line.602"></a>
+<span class="sourceLineNo">603</span>      sc5.cancel();<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      Thread.sleep(sleepTime);<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.605"></a>
+<span class="sourceLineNo">606</span>    } finally {<a name="line.606"></a>
+<span class="sourceLineNo">607</span>      shutdownService(service);<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
+<span class="sourceLineNo">609</span>  }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>  /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>   * ChoreServices should never have a core pool size that exceeds the number of chores that have<a name="line.612"></a>
+<span class="sourceLineNo">613</span>   * been scheduled with the service. For example, if 4 ScheduledChores are scheduled with a<a name="line.613"></a>
+<span class="sourceLineNo">614</span>   * ChoreService, the number of threads in the ChoreService's core pool should never exceed 4<a name="line.614"></a>
+<span class="sourceLineNo">615</span>   */<a name="line.615"></a>
+<span class="sourceLineNo">616</span>  @Test<a name="line.616"></a>
+<span class="sourceLineNo">617</span>  public void testMaximumChoreServiceThreads() throws InterruptedException {<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    ChoreService service = new ChoreService("testMaximumChoreServiceThreads");<a name="line.618"></a>
+<span class="sourceLineNo">619</span><a name="line.619"></a>
+<span class="sourceLineNo">620</span>    final int period = 100;<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    final int sleepTime = 5 * period;<a name="line.621"></a>
+<span class="sourceLineNo">622</span><a name="line.622"></a>
+<span class="sourceLineNo">623</span>    try {<a name="line.623"></a>
+<span class="sourceLineNo">624</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      // ALWAYS miss their start time since their execution takes longer than their period.<a name="line.625"></a>
+<span class="sourceLineNo">626</span>      // Chores that miss their start time will trigger the onChoreMissedStartTime callback<a name="line.626"></a>
+<span class="sourceLineNo">627</span>      // in the ChoreService. This callback will try to increase the number of core pool<a name="line.627"></a>
+<span class="sourceLineNo">628</span>      // threads.<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.630"></a>
+<span class="sourceLineNo">631</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.631"></a>
+<span class="sourceLineNo">632</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.632"></a>
+<span class="sourceLineNo">633</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.633"></a>
+<span class="sourceLineNo">634</span><a name="line.634"></a>
+<span class="sourceLineNo">635</span>      service.scheduleChore(sc1);<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      service.scheduleChore(sc2);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      service.scheduleChore(sc3);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>      service.scheduleChore(sc4);<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      service.scheduleChore(sc5);<a name="line.639"></a>
+<span class="sourceLineNo">640</span><a name="line.640"></a>
+<span class="sourceLineNo">641</span>      Thread.sleep(sleepTime);<a name="line.641"></a>
+<span class="sourceLineNo">642</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>      SlowChore sc6 = new SlowChore("sc6", period);<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      SlowChore sc7 = new SlowChore("sc7", period);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>      SlowChore sc8 = new SlowChore("sc8", period);<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      SlowChore sc9 = new SlowChore("sc9", period);<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      SlowChore sc10 = new SlowChore("sc10", period);<a name="line.648"></a>
+<span class="sourceLineNo">649</span><a name="line.649"></a>
+<span class="sourceLineNo">650</span>      service.scheduleChore(sc6);<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      service.scheduleChore(sc7);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      service.scheduleChore(sc8);<a name="line.652"></a>
+<span class="sourceLineNo">653</span>      service.scheduleChore(sc9);<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      service.scheduleChore(sc10);<a name="line.654"></a>
+<span class="sourceLineNo">655</span><a name="line.655"></a>
+<span class="sourceLineNo">656</span>      Thread.sleep(sleepTime);<a name="line.656"></a>
+<span class="sourceLineNo">657</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    } finally {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>      shutdownService(service);<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    }<a name="line.660"></a>
+<span class="sourceLineNo">661</span>  }<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>  @Test<a name="line.663"></a>
+<span class="sourceLineNo">664</span>  public void testChangingChoreServices() throws InterruptedException {<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    final int period = 100;<a name="line.665"></a>
+<span class="sourceLineNo">666</span>    final int sleepTime = 10;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    ChoreService service1 = new ChoreService("testChangingChoreServices_1");<a name="line.667"></a>
+<span class="sourceLineNo">668</span>    ChoreService service2 = new ChoreService("testChangingChoreServices_2");<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    ScheduledChore chore = new DoNothingChore("sample", period);<a name="line.669"></a>
+<span class="sourceLineNo">670</span><a name="line.670"></a>
+<span class="sourceLineNo">671</span>    try {<a name="line.671"></a>
+<span class="sourceLineNo">672</span>      assertFalse(chore.isScheduled());<a name="line.672"></a>
+<span class="sourceLineNo">673</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>      service1.scheduleChore(chore);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>      Thread.sleep(sleepTime);<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      assertTrue(chore.isScheduled());<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      assertTrue(service1.isChoreScheduled(chore));<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.682"></a>
+<span class="sourceLineNo">683</span><a name="line.683"></a>
+<span class="sourceLineNo">684</span>      service2.scheduleChore(chore);<a name="line.684"></a>
+<span class="sourceLineNo">685</span>      Thread.sleep(sleepTime);<a name="line.685"></a>
+<span class="sourceLineNo">686</span>      assertTrue(chore.isScheduled());<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.687"></a>
+<span class="sourceLineNo">688</span>      assertTrue(service2.isChoreScheduled(chore));<a name="line.688"></a>
+<span class="sourceLineNo">689</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.689"></a>
+<span class="sourceLineNo">690</span><a name="line.690"></a>
+<span class="sourceLineNo">691</span>      chore.cancel();<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      assertFalse(chore.isScheduled());<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.695"></a>
+<span class="sourceLineNo">696</span>    } finally {<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      shutdownService(service1);<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      shutdownService(service2);<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    }<a name="line.699"></a>
+<span class="sourceLineNo">700</span>  }<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>  @Test<a name="line.702"></a>
+<span class="sourceLineNo">703</span>  public void testStopperForScheduledChores() throws InterruptedException {<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    ChoreService service = new ChoreService("testStopperForScheduledChores");<a name="line.704"></a>
+<span class="sourceLineNo">705</span>    Stoppable stopperForGroup1 = new SampleStopper();<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    Stoppable stopperForGroup2 = new SampleStopper();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    final int period = 100;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    final int delta = period/10;<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>    try {<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      ScheduledChore chore1_group1 = new DoNothingChore("c1g1", stopperForGroup1, period);<a name="line.711"></a>
+<span class="sourceLineNo">712</span>      ScheduledChore chore2_group1 = new DoNothingChore("c2g1", stopperForGroup1, period);<a name="line.712"></a>
+<span class="sourceLineNo">713</span>      ScheduledChore chore3_group1 = new DoNothingChore("c3g1", stopperForGroup1, period);<a name="line.713"></a>
+<span class="sourceLineNo">714</span><a name="line.714"></a>
+<span class="sourceLineNo">715</span>      ScheduledChore chore1_group2 = new DoNothingChore("c1g2", stopperForGroup2, period);<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      ScheduledChore chore2_group2 = new DoNothingChore("c2g2", stopperForGroup2, period);<a name="line.716"></a>
+<span class="sourceLineNo">717</span>      ScheduledChore chore3_group2 = new DoNothingChore("c3g2", stopperForGroup2, period);<a name="line.717"></a>
+<span class="sourceLineNo">718</span><a name="line.718"></a>
+<span class="sourceLineNo">719</span>      service.scheduleChore(chore1_group1);<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      service.scheduleChore(chore2_group1);<a name="line.720"></a>
+<span class="sourceLineNo">721</span>      service.scheduleChore(chore3_group1);<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      service.scheduleChore(chore1_group2);<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      service.scheduleChore(chore2_group2);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      service.scheduleChore(chore3_group2);<a name="line.724"></a>
+<span class="sourceLineNo">725</span><a name="line.725"></a>
+<span class="sourceLineNo">726</span>      Thread.sleep(delta);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      Thread.sleep(10 * period);<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      assertTrue(chore1_group1.isScheduled());<a name="line.728"></a>
+<span class="sourceLineNo">729</span>      assertTrue(chore2_group1.isScheduled());<a name="line.729"></a>
+<span class="sourceLineNo">730</span>      assertTrue(chore3_group1.isScheduled());<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      assertTrue(chore1_group2.isScheduled());<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      assertTrue(chore2_group2.isScheduled());<a name="line.732"></a>
+<span class="sourceLineNo">733</span>      assertTrue(chore3_group2.isScheduled());<a name="line.733"></a>
+<span class="sourceLineNo">734</span><a name="line.734"></a>
+<span class="sourceLineNo">735</span>      stopperForGroup1.stop("test stopping group 1");<a name="line.735"></a>
+<span class="sourceLineNo">736</span>      Thread.sleep(period);<a name="line.736"></a>
+<span class="sourceLineNo">737</span>      assertFalse(chore1_group1.isScheduled());<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      assertFalse(chore2_group1.isScheduled());<a name="line.738"></a>
+<span class="sourceLineNo">739</span>      assertFalse(chore3_group1.isScheduled());<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      assertTrue(chore1_group2.isScheduled());<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      assertTrue(chore2_group2.isScheduled());<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      assertTrue(chore3_group2.isScheduled());<a name="line.742"></a>
+<span class="sourceLineNo">743</span><a name="line.743"></a>
+<span class="sourceLineNo">744</span>      stopperForGroup2.stop("test stopping group 2");<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      Thread.sleep(period);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      assertFalse(chore1_group1.isScheduled());<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      assertFalse(chore2_group1.isScheduled());<a name="line.747"></a>
+<span class="sourceLineNo">748</span>      assertFalse(chore3_group1.isScheduled());<a name="line.748"></a>
+<span class="sourceLineNo">749</span>      assertFalse(chore1_group2.isScheduled());<a name="line.749"></a>
+<span class="sourceLineNo">750</span>      assertFalse(chore2_group2.isScheduled());<a name="line.750"></a>
+<span class="sourceLineNo">751</span>      assertFalse(chore3_group2.isScheduled());<a name="line.751"></a>
+<span class="sourceLineNo">752</span>    } finally {<a name="line.752"></a>
+<span class="sourceLineNo">753</span>      shutdownService(service);<a name="line.753"></a>
+<span class="sourceLineNo">754</span>    }<a name="line.754"></a>
+<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>  @Test<a name="line.757"></a>
+<span class="sourceLineNo">758</span>  public void testShutdownCancelsScheduledChores() throws InterruptedException {<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    final int period = 100;<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    ChoreService service = new ChoreService("testShutdownCancelsScheduledChores");<a name="line.760"></a>
+<span class="sourceLineNo">761</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.761"></a>
+<span class="sourceLineNo">762</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.762"></a>
+<span class="sourceLineNo">763</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.763"></a>
+<span class="sourceLineNo">764</span><a name="line.764"></a>
+<span class="sourceLineNo">765</span>    try {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      assertTrue(successChore1.isScheduled());<a name="line.767"></a>
+<span class="sourceLineNo">768</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.768"></a>
+<span class="sourceLineNo">769</span>      assertTrue(successChore2.isScheduled());<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.770"></a>
+<span class="sourceLineNo">771</span>      assertTrue(successChore3.isScheduled());<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    } finally {<a name="line.772"></a>
+<span class="sourceLineNo">773</span>      shutdownService(service);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>    assertFalse(successChore1.isScheduled());<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    assertFalse(successChore2.isScheduled());<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    assertFalse(successChore3.isScheduled());<a name="line.778"></a>
+<span class="sourceLineNo">779</span>  }<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>  @Test<a name="line.781"></a>
+<span class="sourceLineNo">782</span>  public void testShutdownWorksWhileChoresAreExecuting() throws InterruptedException {<a name="line.782"></a>
+<span class="sourceLineNo">783</span>    final int period = 100;<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    final int sleep = 5 * period;<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    ChoreService service = new ChoreService("testShutdownWorksWhileChoresAreExecuting");<a name="line.785"></a>
+<span class="sourceLineNo">786</span>    ScheduledChore slowChore1 = new SleepingChore("sc1", period, sleep);<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    ScheduledChore slowChore2 = new SleepingChore("sc2", period, sleep);<a name="line.787"></a>
+<span class="sourceLineNo">788</span>    ScheduledChore slowChore3 = new SleepingChore("sc3", period, sleep);<a name="line.788"></a>
+<span class="sourceLineNo">789</span>    try {<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      assertTrue(service.scheduleChore(slowChore1));<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      assertTrue(service.scheduleChore(slowChore2));<a name="line.791"></a>
+<span class="sourceLineNo">792</span>      assertTrue(service.scheduleChore(slowChore3));<a name="line.792"></a>
+<span class="sourceLineNo">793</span><a name="line.793"></a>
+<span class="sourceLineNo">794</span>      Thread.sleep(sleep / 2);<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      shutdownService(service);<a name="line.795"></a>
+<span class="sourceLineNo">796</span><a name="line.796"></a>
+<span class="sourceLineNo">797</span>      assertFalse(slowChore1.isScheduled());<a name="line.797"></a>
+<span class="sourceLineNo">798</span>      assertFalse(slowChore2.isScheduled());<a name="line.798"></a>
+<span class="sourceLineNo">799</span>      assertFalse(slowChore3.isScheduled());<a name="line.799"></a>
+<span class="sourceLineNo">800</span>      assertTrue(service.isShutdown());<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>      Thread.sleep(5);<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      assertTrue(service.isTerminated());<a name="line.803"></a>
+<span class="sourceLineNo">804</span>    } finally {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>      shutdownService(service);<a name="line.805"></a>
+<span class="sourceLineNo">806</span>    }<a name="line.806"></a>
+<span class="sourceLineNo">807</span>  }<a name="line.807"></a>
+<span class="sourceLineNo">808</span><a name="line.808"></a>
+<span class="sourceLineNo">809</span>  @Test<a name="line.809"></a>
+<span class="sourceLineNo">810</span>  public void testShutdownRejectsNewSchedules() throws InterruptedException {<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    final int period = 100;<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    ChoreService service = new ChoreService("testShutdownRejectsNewSchedules");<a name="line.812"></a>
+<span class="sourceLineNo">813</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    ScheduledChore failChore1 = new DoNothingChore("fc1", period);<a name="line.816"></a>
+<span class="sourceLineNo">817</span>    ScheduledChore failChore2 = new DoNothingChore("fc2", period);<a name="line.817"></a>
+<span class="sourceLineNo">818</span>    ScheduledChore failChore3 = new DoNothingChore("fc3", period);<a name="line.818"></a>
+<span class="sourceLineNo">819</span><a name="line.819"></a>
+<span class="sourceLineNo">820</span>    try {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      assertTrue(successChore1.isScheduled());<a name="line.822"></a>
+<span class="sourceLineNo">823</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.823"></a>
+<span class="sourceLineNo">824</span>      assertTrue(successChore2.isScheduled());<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      assertTrue(successChore3.isScheduled());<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    } finally {<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      shutdownService(service);<a name="line.828"></a>
+<span class="sourceLineNo">829</span>    }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>    assertFalse(service.scheduleChore(failChore1));<a name="line.831"></a>
+<span class="sourceLineNo">832</span>    assertFalse(failChore1.isScheduled());<a name="line.832"></a>
+<span class="sourceLineNo">833</span>    assertFalse(service.scheduleChore(failChore2));<a name="line.833"></a>
+<span class="sourceLineNo">834</span>    assertFalse(failChore2.isScheduled());<a name="line.834"></a>
+<span class="sourceLineNo">835</span>    assertFalse(service.scheduleChore(failChore3));<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    assertFalse(failChore3.isScheduled());<a name="line.836"></a>
+<span class="sourceLineNo">837</span>  }<a name="line.837"></a>
+<span class="sourceLineNo">838</span>}<a name="line.838"></a>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.DoNothingChore.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.DoNothingChore.html
index 139ba2f..4fa763e 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.DoNothingChore.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.DoNothingChore.html
@@ -362,17 +362,17 @@
 <span class="sourceLineNo">354</span>  public void testFrequencyOfChores() throws InterruptedException {<a name="line.354"></a>
 <span class="sourceLineNo">355</span>    final int period = 100;<a name="line.355"></a>
 <span class="sourceLineNo">356</span>    // Small delta that acts as time buffer (allowing chores to complete if running slowly)<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    final int delta = 5;<a name="line.357"></a>
+<span class="sourceLineNo">357</span>    final int delta = period/5;<a name="line.357"></a>
 <span class="sourceLineNo">358</span>    ChoreService service = new ChoreService("testFrequencyOfChores");<a name="line.358"></a>
 <span class="sourceLineNo">359</span>    CountingChore chore = new CountingChore("countingChore", period);<a name="line.359"></a>
 <span class="sourceLineNo">360</span>    try {<a name="line.360"></a>
 <span class="sourceLineNo">361</span>      service.scheduleChore(chore);<a name="line.361"></a>
 <span class="sourceLineNo">362</span><a name="line.362"></a>
 <span class="sourceLineNo">363</span>      Thread.sleep(10 * period + delta);<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      assertTrue(chore.getCountOfChoreCalls() == 11);<a name="line.364"></a>
+<span class="sourceLineNo">364</span>      assertEquals("10 periods have elapsed.", 11, chore.getCountOfChoreCalls());<a name="line.364"></a>
 <span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>      Thread.sleep(10 * period);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      assertTrue(chore.getCountOfChoreCalls() == 21);<a name="line.367"></a>
+<span class="sourceLineNo">366</span>      Thread.sleep(10 * period + delta);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      assertEquals("20 periods have elapsed.", 21, chore.getCountOfChoreCalls());<a name="line.367"></a>
 <span class="sourceLineNo">368</span>    } finally {<a name="line.368"></a>
 <span class="sourceLineNo">369</span>      shutdownService(service);<a name="line.369"></a>
 <span class="sourceLineNo">370</span>    }<a name="line.370"></a>
@@ -388,14 +388,14 @@
 <span class="sourceLineNo">380</span>  @Test<a name="line.380"></a>
 <span class="sourceLineNo">381</span>  public void testForceTrigger() throws InterruptedException {<a name="line.381"></a>
 <span class="sourceLineNo">382</span>    final int period = 100;<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    final int delta = 10;<a name="line.383"></a>
+<span class="sourceLineNo">383</span>    final int delta = period/10;<a name="line.383"></a>
 <span class="sourceLineNo">384</span>    ChoreService service = new ChoreService("testForceTrigger");<a name="line.384"></a>
 <span class="sourceLineNo">385</span>    final CountingChore chore = new CountingChore("countingChore", period);<a name="line.385"></a>
 <span class="sourceLineNo">386</span>    try {<a name="line.386"></a>
 <span class="sourceLineNo">387</span>      service.scheduleChore(chore);<a name="line.387"></a>
 <span class="sourceLineNo">388</span>      Thread.sleep(10 * period + delta);<a name="line.388"></a>
 <span class="sourceLineNo">389</span><a name="line.389"></a>
-<span class="sourceLineNo">390</span>      assertTrue(chore.getCountOfChoreCalls() == 11);<a name="line.390"></a>
+<span class="sourceLineNo">390</span>      assertEquals("10 periods have elapsed.", 11, chore.getCountOfChoreCalls());<a name="line.390"></a>
 <span class="sourceLineNo">391</span><a name="line.391"></a>
 <span class="sourceLineNo">392</span>      // Force five runs of the chore to occur, sleeping between triggers to ensure the<a name="line.392"></a>
 <span class="sourceLineNo">393</span>      // chore has time to run<a name="line.393"></a>
@@ -410,438 +410,440 @@
 <span class="sourceLineNo">402</span>      chore.triggerNow();<a name="line.402"></a>
 <span class="sourceLineNo">403</span>      Thread.sleep(delta);<a name="line.403"></a>
 <span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>      assertTrue("" + chore.getCountOfChoreCalls(), chore.getCountOfChoreCalls() == 16);<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>      Thread.sleep(10 * period + delta);<a name="line.407"></a>
-<span class="sourceLineNo">408</span><a name="line.408"></a>
-<span class="sourceLineNo">409</span>      // Be loosey-goosey. It used to be '26' but it was a big flakey relying on timing.<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      assertTrue("" + chore.getCountOfChoreCalls(), chore.getCountOfChoreCalls() &gt; 16);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    } finally {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      shutdownService(service);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  @Test<a name="line.416"></a>
-<span class="sourceLineNo">417</span>  public void testCorePoolIncrease() throws InterruptedException {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    final int initialCorePoolSize = 3;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    ChoreService service = new ChoreService("testCorePoolIncrease", initialCorePoolSize, false);<a name="line.419"></a>
-<span class="sourceLineNo">420</span><a name="line.420"></a>
-<span class="sourceLineNo">421</span>    try {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      assertEquals("Should have a core pool of size: " + initialCorePoolSize, initialCorePoolSize,<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        service.getCorePoolSize());<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>      final int slowChorePeriod = 100;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      SlowChore slowChore1 = new SlowChore("slowChore1", slowChorePeriod);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      SlowChore slowChore2 = new SlowChore("slowChore2", slowChorePeriod);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      SlowChore slowChore3 = new SlowChore("slowChore3", slowChorePeriod);<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>      service.scheduleChore(slowChore1);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      service.scheduleChore(slowChore2);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      service.scheduleChore(slowChore3);<a name="line.432"></a>
-<span class="sourceLineNo">433</span><a name="line.433"></a>
-<span class="sourceLineNo">434</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      assertEquals("Should not create more pools than scheduled chores", 3,<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        service.getCorePoolSize());<a name="line.436"></a>
-<span class="sourceLineNo">437</span><a name="line.437"></a>
-<span class="sourceLineNo">438</span>      SlowChore slowChore4 = new SlowChore("slowChore4", slowChorePeriod);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      service.scheduleChore(slowChore4);<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 4,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        service.getCorePoolSize());<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>      SlowChore slowChore5 = new SlowChore("slowChore5", slowChorePeriod);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      service.scheduleChore(slowChore5);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 5,<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        service.getCorePoolSize());<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    } finally {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      shutdownService(service);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>  @Test<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  public void testCorePoolDecrease() throws InterruptedException {<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    final int initialCorePoolSize = 3;<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    ChoreService service = new ChoreService("testCorePoolDecrease", initialCorePoolSize, false);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    final int chorePeriod = 100;<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    try {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      // Slow chores always miss their start time and thus the core pool size should be at least as<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      // large as the number of running slow chores<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      SlowChore slowChore1 = new SlowChore("slowChore1", chorePeriod);<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      SlowChore slowChore2 = new SlowChore("slowChore2", chorePeriod);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      SlowChore slowChore3 = new SlowChore("slowChore3", chorePeriod);<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>      service.scheduleChore(slowChore1);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      service.scheduleChore(slowChore2);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      service.scheduleChore(slowChore3);<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>      Thread.sleep(chorePeriod * 10);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      assertEquals("Should not create more pools than scheduled chores",<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.474"></a>
-<span class="sourceLineNo">475</span><a name="line.475"></a>
-<span class="sourceLineNo">476</span>      SlowChore slowChore4 = new SlowChore("slowChore4", chorePeriod);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      service.scheduleChore(slowChore4);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      Thread.sleep(chorePeriod * 10);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>      SlowChore slowChore5 = new SlowChore("slowChore5", chorePeriod);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      service.scheduleChore(slowChore5);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      Thread.sleep(chorePeriod * 10);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.485"></a>
-<span class="sourceLineNo">486</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.487"></a>
-<span class="sourceLineNo">488</span><a name="line.488"></a>
-<span class="sourceLineNo">489</span>      // Now we begin to cancel the chores that caused an increase in the core thread pool of the<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      // ChoreService. These cancellations should cause a decrease in the core thread pool.<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      slowChore5.cancel();<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      Thread.sleep(chorePeriod * 10);<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        service.getCorePoolSize());<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>      slowChore4.cancel();<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      Thread.sleep(chorePeriod * 10);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        service.getCorePoolSize());<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      assertEquals(3, service.getNumberOfChoresMissingStartTime());<a name="line.501"></a>
-<span class="sourceLineNo">502</span><a name="line.502"></a>
-<span class="sourceLineNo">503</span>      slowChore3.cancel();<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      Thread.sleep(chorePeriod * 10);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.505"></a>
-<span class="sourceLineNo">506</span>        service.getCorePoolSize());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      assertEquals(2, service.getNumberOfChoresMissingStartTime());<a name="line.507"></a>
-<span class="sourceLineNo">508</span><a name="line.508"></a>
-<span class="sourceLineNo">509</span>      slowChore2.cancel();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      Thread.sleep(chorePeriod * 10);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.511"></a>
-<span class="sourceLineNo">512</span>        service.getCorePoolSize());<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>      slowChore1.cancel();<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      Thread.sleep(chorePeriod * 10);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.517"></a>
-<span class="sourceLineNo">518</span>        service.getCorePoolSize());<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    } finally {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      shutdownService(service);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>  }<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>  @Test<a name="line.525"></a>
-<span class="sourceLineNo">526</span>  public void testNumberOfRunningChores() throws InterruptedException {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    ChoreService service = new ChoreService("testNumberOfRunningChores");<a name="line.527"></a>
-<span class="sourceLineNo">528</span><a name="line.528"></a>
-<span class="sourceLineNo">529</span>    final int period = 100;<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    final int sleepTime = 5;<a name="line.530"></a>
-<span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>    try {<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      DoNothingChore dn1 = new DoNothingChore("dn1", period);<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      DoNothingChore dn2 = new DoNothingChore("dn2", period);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      DoNothingChore dn3 = new DoNothingChore("dn3", period);<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      DoNothingChore dn4 = new DoNothingChore("dn4", period);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      DoNothingChore dn5 = new DoNothingChore("dn5", period);<a name="line.537"></a>
-<span class="sourceLineNo">538</span><a name="line.538"></a>
-<span class="sourceLineNo">539</span>      service.scheduleChore(dn1);<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      service.scheduleChore(dn2);<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      service.scheduleChore(dn3);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      service.scheduleChore(dn4);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      service.scheduleChore(dn5);<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>      Thread.sleep(sleepTime);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      assertEquals("Scheduled chore mismatch", 5, service.getNumberOfScheduledChores());<a name="line.546"></a>
-<span class="sourceLineNo">547</span><a name="line.547"></a>
-<span class="sourceLineNo">548</span>      dn1.cancel();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      Thread.sleep(sleepTime);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      assertEquals("Scheduled chore mismatch", 4, service.getNumberOfScheduledChores());<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>      dn2.cancel();<a name="line.552"></a>
-<span class="sourceLineNo">553</span>      dn3.cancel();<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      dn4.cancel();<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      Thread.sleep(sleepTime);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      assertEquals("Scheduled chore mismatch", 1, service.getNumberOfScheduledChores());<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>      dn5.cancel();<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      Thread.sleep(sleepTime);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      assertEquals("Scheduled chore mismatch", 0, service.getNumberOfScheduledChores());<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    } finally {<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      shutdownService(service);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    }<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  }<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>  @Test<a name="line.566"></a>
-<span class="sourceLineNo">567</span>  public void testNumberOfChoresMissingStartTime() throws InterruptedException {<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    ChoreService service = new ChoreService("testNumberOfChoresMissingStartTime");<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>    final int period = 100;<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    final int sleepTime = 5 * period;<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    try {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      // ALWAYS miss their start time since their execution takes longer than their period<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.580"></a>
-<span class="sourceLineNo">581</span><a name="line.581"></a>
-<span class="sourceLineNo">582</span>      service.scheduleChore(sc1);<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      service.scheduleChore(sc2);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      service.scheduleChore(sc3);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      service.scheduleChore(sc4);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      service.scheduleChore(sc5);<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>      Thread.sleep(sleepTime);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.589"></a>
-<span class="sourceLineNo">590</span><a name="line.590"></a>
-<span class="sourceLineNo">591</span>      sc1.cancel();<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      Thread.sleep(sleepTime);<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.593"></a>
-<span class="sourceLineNo">594</span><a name="line.594"></a>
-<span class="sourceLineNo">595</span>      sc2.cancel();<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      sc3.cancel();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      sc4.cancel();<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      Thread.sleep(sleepTime);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>      sc5.cancel();<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      Thread.sleep(sleepTime);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    } finally {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      shutdownService(service);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  }<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>  /**<a name="line.609"></a>
-<span class="sourceLineNo">610</span>   * ChoreServices should never have a core pool size that exceeds the number of chores that have<a name="line.610"></a>
-<span class="sourceLineNo">611</span>   * been scheduled with the service. For example, if 4 ScheduledChores are scheduled with a<a name="line.611"></a>
-<span class="sourceLineNo">612</span>   * ChoreService, the number of threads in the ChoreService's core pool should never exceed 4<a name="line.612"></a>
-<span class="sourceLineNo">613</span>   */<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  @Test<a name="line.614"></a>
-<span class="sourceLineNo">615</span>  public void testMaximumChoreServiceThreads() throws InterruptedException {<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    ChoreService service = new ChoreService("testMaximumChoreServiceThreads");<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>    final int period = 100;<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    final int sleepTime = 5 * period;<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>    try {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.622"></a>
-<span class="sourceLineNo">623</span>      // ALWAYS miss their start time since their execution takes longer than their period.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      // Chores that miss their start time will trigger the onChoreMissedStartTime callback<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      // in the ChoreService. This callback will try to increase the number of core pool<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      // threads.<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.628"></a>
-<span class="sourceLineNo">629</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.631"></a>
-<span class="sourceLineNo">632</span><a name="line.632"></a>
-<span class="sourceLineNo">633</span>      service.scheduleChore(sc1);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      service.scheduleChore(sc2);<a name="line.634"></a>
-<span class="sourceLineNo">635</span>      service.scheduleChore(sc3);<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      service.scheduleChore(sc4);<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      service.scheduleChore(sc5);<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>      Thread.sleep(sleepTime);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>      SlowChore sc6 = new SlowChore("sc6", period);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      SlowChore sc7 = new SlowChore("sc7", period);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      SlowChore sc8 = new SlowChore("sc8", period);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      SlowChore sc9 = new SlowChore("sc9", period);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      SlowChore sc10 = new SlowChore("sc10", period);<a name="line.646"></a>
-<span class="sourceLineNo">647</span><a name="line.647"></a>
-<span class="sourceLineNo">648</span>      service.scheduleChore(sc6);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      service.scheduleChore(sc7);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      service.scheduleChore(sc8);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      service.scheduleChore(sc9);<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      service.scheduleChore(sc10);<a name="line.652"></a>
-<span class="sourceLineNo">653</span><a name="line.653"></a>
-<span class="sourceLineNo">654</span>      Thread.sleep(sleepTime);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    } finally {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      shutdownService(service);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    }<a name="line.658"></a>
-<span class="sourceLineNo">659</span>  }<a name="line.659"></a>
-<span class="sourceLineNo">660</span><a name="line.660"></a>
-<span class="sourceLineNo">661</span>  @Test<a name="line.661"></a>
-<span class="sourceLineNo">662</span>  public void testChangingChoreServices() throws InterruptedException {<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    final int period = 100;<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    final int sleepTime = 10;<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    ChoreService service1 = new ChoreService("testChangingChoreServices_1");<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    ChoreService service2 = new ChoreService("testChangingChoreServices_2");<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    ScheduledChore chore = new DoNothingChore("sample", period);<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    try {<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      assertFalse(chore.isScheduled());<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.673"></a>
-<span class="sourceLineNo">674</span><a name="line.674"></a>
-<span class="sourceLineNo">675</span>      service1.scheduleChore(chore);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      Thread.sleep(sleepTime);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      assertTrue(chore.isScheduled());<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      assertTrue(service1.isChoreScheduled(chore));<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>      service2.scheduleChore(chore);<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      Thread.sleep(sleepTime);<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      assertTrue(chore.isScheduled());<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      assertTrue(service2.isChoreScheduled(chore));<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.687"></a>
-<span class="sourceLineNo">688</span><a name="line.688"></a>
-<span class="sourceLineNo">689</span>      chore.cancel();<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      assertFalse(chore.isScheduled());<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    } finally {<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      shutdownService(service1);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      shutdownService(service2);<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span>  }<a name="line.698"></a>
-<span class="sourceLineNo">699</span><a name="line.699"></a>
-<span class="sourceLineNo">700</span>  @Test<a name="line.700"></a>
-<span class="sourceLineNo">701</span>  public void testStopperForScheduledChores() throws InterruptedException {<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    ChoreService service = new ChoreService("testStopperForScheduledChores");<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    Stoppable stopperForGroup1 = new SampleStopper();<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    Stoppable stopperForGroup2 = new SampleStopper();<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    final int period = 100;<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    final int delta = 10;<a name="line.706"></a>
-<span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    try {<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      ScheduledChore chore1_group1 = new DoNothingChore("c1g1", stopperForGroup1, period);<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      ScheduledChore chore2_group1 = new DoNothingChore("c2g1", stopperForGroup1, period);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      ScheduledChore chore3_group1 = new DoNothingChore("c3g1", stopperForGroup1, period);<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      ScheduledChore chore1_group2 = new DoNothingChore("c1g2", stopperForGroup2, period);<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      ScheduledChore chore2_group2 = new DoNothingChore("c2g2", stopperForGroup2, period);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      ScheduledChore chore3_group2 = new DoNothingChore("c3g2", stopperForGroup2, period);<a name="line.715"></a>
-<span class="sourceLineNo">716</span><a name="line.716"></a>
-<span class="sourceLineNo">717</span>      service.scheduleChore(chore1_group1);<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      service.scheduleChore(chore2_group1);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      service.scheduleChore(chore3_group1);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      service.scheduleChore(chore1_group2);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      service.scheduleChore(chore2_group2);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      service.scheduleChore(chore3_group2);<a name="line.722"></a>
-<span class="sourceLineNo">723</span><a name="line.723"></a>
-<span class="sourceLineNo">724</span>      Thread.sleep(delta);<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      Thread.sleep(10 * period);<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      assertTrue(chore1_group1.isScheduled());<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      assertTrue(chore2_group1.isScheduled());<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      assertTrue(chore3_group1.isScheduled());<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      assertTrue(chore1_group2.isScheduled());<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      assertTrue(chore2_group2.isScheduled());<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      assertTrue(chore3_group2.isScheduled());<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>      stopperForGroup1.stop("test stopping group 1");<a name="line.733"></a>
-<span class="sourceLineNo">734</span>      Thread.sleep(period);<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      assertFalse(chore1_group1.isScheduled());<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      assertFalse(chore2_group1.isScheduled());<a name="line.736"></a>
-<span class="sourceLineNo">737</span>      assertFalse(chore3_group1.isScheduled());<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      assertTrue(chore1_group2.isScheduled());<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      assertTrue(chore2_group2.isScheduled());<a name="line.739"></a>
-<span class="sourceLineNo">740</span>      assertTrue(chore3_group2.isScheduled());<a name="line.740"></a>
-<span class="sourceLineNo">741</span><a name="line.741"></a>
-<span class="sourceLineNo">742</span>      stopperForGroup2.stop("test stopping group 2");<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      Thread.sleep(period);<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      assertFalse(chore1_group1.isScheduled());<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      assertFalse(chore2_group1.isScheduled());<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      assertFalse(chore3_group1.isScheduled());<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      assertFalse(chore1_group2.isScheduled());<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      assertFalse(chore2_group2.isScheduled());<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      assertFalse(chore3_group2.isScheduled());<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    } finally {<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      shutdownService(service);<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    }<a name="line.752"></a>
-<span class="sourceLineNo">753</span>  }<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>  @Test<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public void testShutdownCancelsScheduledChores() throws InterruptedException {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>    final int period = 100;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    ChoreService service = new ChoreService("testShutdownCancelsScheduledChores");<a name="line.758"></a>
-<span class="sourceLineNo">759</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.761"></a>
-<span class="sourceLineNo">762</span><a name="line.762"></a>
-<span class="sourceLineNo">763</span>    try {<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      assertTrue(successChore1.isScheduled());<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.766"></a>
-<span class="sourceLineNo">767</span>      assertTrue(successChore2.isScheduled());<a name="line.767"></a>
-<span class="sourceLineNo">768</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      assertTrue(successChore3.isScheduled());<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    } finally {<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      shutdownService(service);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    }<a name="line.772"></a>
-<span class="sourceLineNo">773</span><a name="line.773"></a>
-<span class="sourceLineNo">774</span>    assertFalse(successChore1.isScheduled());<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    assertFalse(successChore2.isScheduled());<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    assertFalse(successChore3.isScheduled());<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  @Test<a name="line.779"></a>
-<span class="sourceLineNo">780</span>  public void testShutdownWorksWhileChoresAreExecuting() throws InterruptedException {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    final int period = 100;<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    final int sleep = 5 * period;<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    ChoreService service = new ChoreService("testShutdownWorksWhileChoresAreExecuting");<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    ScheduledChore slowChore1 = new SleepingChore("sc1", period, sleep);<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    ScheduledChore slowChore2 = new SleepingChore("sc2", period, sleep);<a name="line.785"></a>
-<span class="sourceLineNo">786</span>    ScheduledChore slowChore3 = new SleepingChore("sc3", period, sleep);<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    try {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      assertTrue(service.scheduleChore(slowChore1));<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      assertTrue(service.scheduleChore(slowChore2));<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      assertTrue(service.scheduleChore(slowChore3));<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>      Thread.sleep(sleep / 2);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>      shutdownService(service);<a name="line.793"></a>
-<span class="sourceLineNo">794</span><a name="line.794"></a>
-<span class="sourceLineNo">795</span>      assertFalse(slowChore1.isScheduled());<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      assertFalse(slowChore2.isScheduled());<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      assertFalse(slowChore3.isScheduled());<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      assertTrue(service.isShutdown());<a name="line.798"></a>
-<span class="sourceLineNo">799</span><a name="line.799"></a>
-<span class="sourceLineNo">800</span>      Thread.sleep(5);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      assertTrue(service.isTerminated());<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    } finally {<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      shutdownService(service);<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    }<a name="line.804"></a>
-<span class="sourceLineNo">805</span>  }<a name="line.805"></a>
-<span class="sourceLineNo">806</span><a name="line.806"></a>
-<span class="sourceLineNo">807</span>  @Test<a name="line.807"></a>
-<span class="sourceLineNo">808</span>  public void testShutdownRejectsNewSchedules() throws InterruptedException {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    final int period = 100;<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    ChoreService service = new ChoreService("testShutdownRejectsNewSchedules");<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    ScheduledChore failChore1 = new DoNothingChore("fc1", period);<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    ScheduledChore failChore2 = new DoNothingChore("fc2", period);<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    ScheduledChore failChore3 = new DoNothingChore("fc3", period);<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>    try {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.819"></a>
-<span class="sourceLineNo">820</span>      assertTrue(successChore1.isScheduled());<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      assertTrue(successChore2.isScheduled());<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      assertTrue(successChore3.isScheduled());<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    } finally {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      shutdownService(service);<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>    assertFalse(service.scheduleChore(failChore1));<a name="line.829"></a>
-<span class="sourceLineNo">830</span>    assertFalse(failChore1.isScheduled());<a name="line.830"></a>
-<span class="sourceLineNo">831</span>    assertFalse(service.scheduleChore(failChore2));<a name="line.831"></a>
-<span class="sourceLineNo">832</span>    assertFalse(failChore2.isScheduled());<a name="line.832"></a>
-<span class="sourceLineNo">833</span>    assertFalse(service.scheduleChore(failChore3));<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    assertFalse(failChore3.isScheduled());<a name="line.834"></a>
-<span class="sourceLineNo">835</span>  }<a name="line.835"></a>
-<span class="sourceLineNo">836</span>}<a name="line.836"></a>
+<span class="sourceLineNo">405</span>      assertEquals("Trigger was called 5 times after 10 periods.", 16,<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          chore.getCountOfChoreCalls());<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>      Thread.sleep(10 * period + delta);<a name="line.408"></a>
+<span class="sourceLineNo">409</span><a name="line.409"></a>
+<span class="sourceLineNo">410</span>      // Be loosey-goosey. It used to be '26' but it was a big flakey relying on timing.<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      assertTrue("Expected at least 16 invocations, instead got " + chore.getCountOfChoreCalls(),<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          chore.getCountOfChoreCalls() &gt; 16);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    } finally {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      shutdownService(service);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    }<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  }<a name="line.416"></a>
+<span class="sourceLineNo">417</span><a name="line.417"></a>
+<span class="sourceLineNo">418</span>  @Test<a name="line.418"></a>
+<span class="sourceLineNo">419</span>  public void testCorePoolIncrease() throws InterruptedException {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    final int initialCorePoolSize = 3;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    ChoreService service = new ChoreService("testCorePoolIncrease", initialCorePoolSize, false);<a name="line.421"></a>
+<span class="sourceLineNo">422</span><a name="line.422"></a>
+<span class="sourceLineNo">423</span>    try {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>      assertEquals("Setting core pool size gave unexpected results.", initialCorePoolSize,<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        service.getCorePoolSize());<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>      final int slowChorePeriod = 100;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      SlowChore slowChore1 = new SlowChore("slowChore1", slowChorePeriod);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      SlowChore slowChore2 = new SlowChore("slowChore2", slowChorePeriod);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>      SlowChore slowChore3 = new SlowChore("slowChore3", slowChorePeriod);<a name="line.430"></a>
+<span class="sourceLineNo">431</span><a name="line.431"></a>
+<span class="sourceLineNo">432</span>      service.scheduleChore(slowChore1);<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      service.scheduleChore(slowChore2);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      service.scheduleChore(slowChore3);<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      assertEquals("Should not create more pools than scheduled chores", 3,<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        service.getCorePoolSize());<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>      SlowChore slowChore4 = new SlowChore("slowChore4", slowChorePeriod);<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      service.scheduleChore(slowChore4);<a name="line.441"></a>
+<span class="sourceLineNo">442</span><a name="line.442"></a>
+<span class="sourceLineNo">443</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 4,<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        service.getCorePoolSize());<a name="line.445"></a>
+<span class="sourceLineNo">446</span><a name="line.446"></a>
+<span class="sourceLineNo">447</span>      SlowChore slowChore5 = new SlowChore("slowChore5", slowChorePeriod);<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      service.scheduleChore(slowChore5);<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 5,<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        service.getCorePoolSize());<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    } finally {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      shutdownService(service);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
+<span class="sourceLineNo">457</span><a name="line.457"></a>
+<span class="sourceLineNo">458</span>  @Test<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  public void testCorePoolDecrease() throws InterruptedException {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    final int initialCorePoolSize = 3;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    ChoreService service = new ChoreService("testCorePoolDecrease", initialCorePoolSize, false);<a name="line.461"></a>
+<span class="sourceLineNo">462</span>    final int chorePeriod = 100;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    try {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>      // Slow chores always miss their start time and thus the core pool size should be at least as<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      // large as the number of running slow chores<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      SlowChore slowChore1 = new SlowChore("slowChore1", chorePeriod);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      SlowChore slowChore2 = new SlowChore("slowChore2", chorePeriod);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      SlowChore slowChore3 = new SlowChore("slowChore3", chorePeriod);<a name="line.468"></a>
+<span class="sourceLineNo">469</span><a name="line.469"></a>
+<span class="sourceLineNo">470</span>      service.scheduleChore(slowChore1);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      service.scheduleChore(slowChore2);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>      service.scheduleChore(slowChore3);<a name="line.472"></a>
+<span class="sourceLineNo">473</span><a name="line.473"></a>
+<span class="sourceLineNo">474</span>      Thread.sleep(chorePeriod * 10);<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      assertEquals("Should not create more pools than scheduled chores",<a name="line.475"></a>
+<span class="sourceLineNo">476</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>      SlowChore slowChore4 = new SlowChore("slowChore4", chorePeriod);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      service.scheduleChore(slowChore4);<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      Thread.sleep(chorePeriod * 10);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.481"></a>
+<span class="sourceLineNo">482</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>      SlowChore slowChore5 = new SlowChore("slowChore5", chorePeriod);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      service.scheduleChore(slowChore5);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      Thread.sleep(chorePeriod * 10);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.487"></a>
+<span class="sourceLineNo">488</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>      // Now we begin to cancel the chores that caused an increase in the core thread pool of the<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      // ChoreService. These cancellations should cause a decrease in the core thread pool.<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      slowChore5.cancel();<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      Thread.sleep(chorePeriod * 10);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.495"></a>
+<span class="sourceLineNo">496</span>        service.getCorePoolSize());<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.497"></a>
+<span class="sourceLineNo">498</span><a name="line.498"></a>
+<span class="sourceLineNo">499</span>      slowChore4.cancel();<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      Thread.sleep(chorePeriod * 10);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        service.getCorePoolSize());<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      assertEquals(3, service.getNumberOfChoresMissingStartTime());<a name="line.503"></a>
+<span class="sourceLineNo">504</span><a name="line.504"></a>
+<span class="sourceLineNo">505</span>      slowChore3.cancel();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      Thread.sleep(chorePeriod * 10);<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        service.getCorePoolSize());<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      assertEquals(2, service.getNumberOfChoresMissingStartTime());<a name="line.509"></a>
+<span class="sourceLineNo">510</span><a name="line.510"></a>
+<span class="sourceLineNo">511</span>      slowChore2.cancel();<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      Thread.sleep(chorePeriod * 10);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.513"></a>
+<span class="sourceLineNo">514</span>        service.getCorePoolSize());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.515"></a>
+<span class="sourceLineNo">516</span><a name="line.516"></a>
+<span class="sourceLineNo">517</span>      slowChore1.cancel();<a name="line.517"></a>
+<span class="sourceLineNo">518</span>      Thread.sleep(chorePeriod * 10);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.519"></a>
+<span class="sourceLineNo">520</span>        service.getCorePoolSize());<a name="line.520"></a>
+<span class="sourceLineNo">521</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    } finally {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      shutdownService(service);<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
+<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>  @Test<a name="line.527"></a>
+<span class="sourceLineNo">528</span>  public void testNumberOfRunningChores() throws InterruptedException {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    ChoreService service = new ChoreService("testNumberOfRunningChores");<a name="line.529"></a>
+<span class="sourceLineNo">530</span><a name="line.530"></a>
+<span class="sourceLineNo">531</span>    final int period = 100;<a name="line.531"></a>
+<span class="sourceLineNo">532</span>    final int sleepTime = 5;<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>    try {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      DoNothingChore dn1 = new DoNothingChore("dn1", period);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      DoNothingChore dn2 = new DoNothingChore("dn2", period);<a name="line.536"></a>
+<span class="sourceLineNo">537</span>      DoNothingChore dn3 = new DoNothingChore("dn3", period);<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      DoNothingChore dn4 = new DoNothingChore("dn4", period);<a name="line.538"></a>
+<span class="sourceLineNo">539</span>      DoNothingChore dn5 = new DoNothingChore("dn5", period);<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>      service.scheduleChore(dn1);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      service.scheduleChore(dn2);<a name="line.542"></a>
+<span class="sourceLineNo">543</span>      service.scheduleChore(dn3);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>      service.scheduleChore(dn4);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      service.scheduleChore(dn5);<a name="line.545"></a>
+<span class="sourceLineNo">546</span><a name="line.546"></a>
+<span class="sourceLineNo">547</span>      Thread.sleep(sleepTime);<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      assertEquals("Scheduled chore mismatch", 5, service.getNumberOfScheduledChores());<a name="line.548"></a>
+<span class="sourceLineNo">549</span><a name="line.549"></a>
+<span class="sourceLineNo">550</span>      dn1.cancel();<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      Thread.sleep(sleepTime);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      assertEquals("Scheduled chore mismatch", 4, service.getNumberOfScheduledChores());<a name="line.552"></a>
+<span class="sourceLineNo">553</span><a name="line.553"></a>
+<span class="sourceLineNo">554</span>      dn2.cancel();<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      dn3.cancel();<a name="line.555"></a>
+<span class="sourceLineNo">556</span>      dn4.cancel();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>      Thread.sleep(sleepTime);<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      assertEquals("Scheduled chore mismatch", 1, service.getNumberOfScheduledChores());<a name="line.558"></a>
+<span class="sourceLineNo">559</span><a name="line.559"></a>
+<span class="sourceLineNo">560</span>      dn5.cancel();<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      Thread.sleep(sleepTime);<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      assertEquals("Scheduled chore mismatch", 0, service.getNumberOfScheduledChores());<a name="line.562"></a>
+<span class="sourceLineNo">563</span>    } finally {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      shutdownService(service);<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    }<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  @Test<a name="line.568"></a>
+<span class="sourceLineNo">569</span>  public void testNumberOfChoresMissingStartTime() throws InterruptedException {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    ChoreService service = new ChoreService("testNumberOfChoresMissingStartTime");<a name="line.570"></a>
+<span class="sourceLineNo">571</span><a name="line.571"></a>
+<span class="sourceLineNo">572</span>    final int period = 100;<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    final int sleepTime = 5 * period;<a name="line.573"></a>
+<span class="sourceLineNo">574</span><a name="line.574"></a>
+<span class="sourceLineNo">575</span>    try {<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      // ALWAYS miss their start time since their execution takes longer than their period<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.578"></a>
+<span class="sourceLineNo">579</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.581"></a>
+<span class="sourceLineNo">582</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.582"></a>
+<span class="sourceLineNo">583</span><a name="line.583"></a>
+<span class="sourceLineNo">584</span>      service.scheduleChore(sc1);<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      service.scheduleChore(sc2);<a name="line.585"></a>
+<span class="sourceLineNo">586</span>      service.scheduleChore(sc3);<a name="line.586"></a>
+<span class="sourceLineNo">587</span>      service.scheduleChore(sc4);<a name="line.587"></a>
+<span class="sourceLineNo">588</span>      service.scheduleChore(sc5);<a name="line.588"></a>
+<span class="sourceLineNo">589</span><a name="line.589"></a>
+<span class="sourceLineNo">590</span>      Thread.sleep(sleepTime);<a name="line.590"></a>
+<span class="sourceLineNo">591</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.591"></a>
+<span class="sourceLineNo">592</span><a name="line.592"></a>
+<span class="sourceLineNo">593</span>      sc1.cancel();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>      Thread.sleep(sleepTime);<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>      sc2.cancel();<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      sc3.cancel();<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      sc4.cancel();<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      Thread.sleep(sleepTime);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.601"></a>
+<span class="sourceLineNo">602</span><a name="line.602"></a>
+<span class="sourceLineNo">603</span>      sc5.cancel();<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      Thread.sleep(sleepTime);<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.605"></a>
+<span class="sourceLineNo">606</span>    } finally {<a name="line.606"></a>
+<span class="sourceLineNo">607</span>      shutdownService(service);<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
+<span class="sourceLineNo">609</span>  }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>  /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>   * ChoreServices should never have a core pool size that exceeds the number of chores that have<a name="line.612"></a>
+<span class="sourceLineNo">613</span>   * been scheduled with the service. For example, if 4 ScheduledChores are scheduled with a<a name="line.613"></a>
+<span class="sourceLineNo">614</span>   * ChoreService, the number of threads in the ChoreService's core pool should never exceed 4<a name="line.614"></a>
+<span class="sourceLineNo">615</span>   */<a name="line.615"></a>
+<span class="sourceLineNo">616</span>  @Test<a name="line.616"></a>
+<span class="sourceLineNo">617</span>  public void testMaximumChoreServiceThreads() throws InterruptedException {<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    ChoreService service = new ChoreService("testMaximumChoreServiceThreads");<a name="line.618"></a>
+<span class="sourceLineNo">619</span><a name="line.619"></a>
+<span class="sourceLineNo">620</span>    final int period = 100;<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    final int sleepTime = 5 * period;<a name="line.621"></a>
+<span class="sourceLineNo">622</span><a name="line.622"></a>
+<span class="sourceLineNo">623</span>    try {<a name="line.623"></a>
+<span class="sourceLineNo">624</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      // ALWAYS miss their start time since their execution takes longer than their period.<a name="line.625"></a>
+<span class="sourceLineNo">626</span>      // Chores that miss their start time will trigger the onChoreMissedStartTime callback<a name="line.626"></a>
+<span class="sourceLineNo">627</span>      // in the ChoreService. This callback will try to increase the number of core pool<a name="line.627"></a>
+<span class="sourceLineNo">628</span>      // threads.<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.630"></a>
+<span class="sourceLineNo">631</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.631"></a>
+<span class="sourceLineNo">632</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.632"></a>
+<span class="sourceLineNo">633</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.633"></a>
+<span class="sourceLineNo">634</span><a name="line.634"></a>
+<span class="sourceLineNo">635</span>      service.scheduleChore(sc1);<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      service.scheduleChore(sc2);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      service.scheduleChore(sc3);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>      service.scheduleChore(sc4);<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      service.scheduleChore(sc5);<a name="line.639"></a>
+<span class="sourceLineNo">640</span><a name="line.640"></a>
+<span class="sourceLineNo">641</span>      Thread.sleep(sleepTime);<a name="line.641"></a>
+<span class="sourceLineNo">642</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>      SlowChore sc6 = new SlowChore("sc6", period);<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      SlowChore sc7 = new SlowChore("sc7", period);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>      SlowChore sc8 = new SlowChore("sc8", period);<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      SlowChore sc9 = new SlowChore("sc9", period);<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      SlowChore sc10 = new SlowChore("sc10", period);<a name="line.648"></a>
+<span class="sourceLineNo">649</span><a name="line.649"></a>
+<span class="sourceLineNo">650</span>      service.scheduleChore(sc6);<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      service.scheduleChore(sc7);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      service.scheduleChore(sc8);<a name="line.652"></a>
+<span class="sourceLineNo">653</span>      service.scheduleChore(sc9);<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      service.scheduleChore(sc10);<a name="line.654"></a>
+<span class="sourceLineNo">655</span><a name="line.655"></a>
+<span class="sourceLineNo">656</span>      Thread.sleep(sleepTime);<a name="line.656"></a>
+<span class="sourceLineNo">657</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    } finally {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>      shutdownService(service);<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    }<a name="line.660"></a>
+<span class="sourceLineNo">661</span>  }<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>  @Test<a name="line.663"></a>
+<span class="sourceLineNo">664</span>  public void testChangingChoreServices() throws InterruptedException {<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    final int period = 100;<a name="line.665"></a>
+<span class="sourceLineNo">666</span>    final int sleepTime = 10;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    ChoreService service1 = new ChoreService("testChangingChoreServices_1");<a name="line.667"></a>
+<span class="sourceLineNo">668</span>    ChoreService service2 = new ChoreService("testChangingChoreServices_2");<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    ScheduledChore chore = new DoNothingChore("sample", period);<a name="line.669"></a>
+<span class="sourceLineNo">670</span><a name="line.670"></a>
+<span class="sourceLineNo">671</span>    try {<a name="line.671"></a>
+<span class="sourceLineNo">672</span>      assertFalse(chore.isScheduled());<a name="line.672"></a>
+<span class="sourceLineNo">673</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>      service1.scheduleChore(chore);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>      Thread.sleep(sleepTime);<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      assertTrue(chore.isScheduled());<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      assertTrue(service1.isChoreScheduled(chore));<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.682"></a>
+<span class="sourceLineNo">683</span><a name="line.683"></a>
+<span class="sourceLineNo">684</span>      service2.scheduleChore(chore);<a name="line.684"></a>
+<span class="sourceLineNo">685</span>      Thread.sleep(sleepTime);<a name="line.685"></a>
+<span class="sourceLineNo">686</span>      assertTrue(chore.isScheduled());<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.687"></a>
+<span class="sourceLineNo">688</span>      assertTrue(service2.isChoreScheduled(chore));<a name="line.688"></a>
+<span class="sourceLineNo">689</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.689"></a>
+<span class="sourceLineNo">690</span><a name="line.690"></a>
+<span class="sourceLineNo">691</span>      chore.cancel();<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      assertFalse(chore.isScheduled());<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.695"></a>
+<span class="sourceLineNo">696</span>    } finally {<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      shutdownService(service1);<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      shutdownService(service2);<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    }<a name="line.699"></a>
+<span class="sourceLineNo">700</span>  }<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>  @Test<a name="line.702"></a>
+<span class="sourceLineNo">703</span>  public void testStopperForScheduledChores() throws InterruptedException {<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    ChoreService service = new ChoreService("testStopperForScheduledChores");<a name="line.704"></a>
+<span class="sourceLineNo">705</span>    Stoppable stopperForGroup1 = new SampleStopper();<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    Stoppable stopperForGroup2 = new SampleStopper();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    final int period = 100;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    final int delta = period/10;<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>    try {<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      ScheduledChore chore1_group1 = new DoNothingChore("c1g1", stopperForGroup1, period);<a name="line.711"></a>
+<span class="sourceLineNo">712</span>      ScheduledChore chore2_group1 = new DoNothingChore("c2g1", stopperForGroup1, period);<a name="line.712"></a>
+<span class="sourceLineNo">713</span>      ScheduledChore chore3_group1 = new DoNothingChore("c3g1", stopperForGroup1, period);<a name="line.713"></a>
+<span class="sourceLineNo">714</span><a name="line.714"></a>
+<span class="sourceLineNo">715</span>      ScheduledChore chore1_group2 = new DoNothingChore("c1g2", stopperForGroup2, period);<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      ScheduledChore chore2_group2 = new DoNothingChore("c2g2", stopperForGroup2, period);<a name="line.716"></a>
+<span class="sourceLineNo">717</span>      ScheduledChore chore3_group2 = new DoNothingChore("c3g2", stopperForGroup2, period);<a name="line.717"></a>
+<span class="sourceLineNo">718</span><a name="line.718"></a>
+<span class="sourceLineNo">719</span>      service.scheduleChore(chore1_group1);<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      service.scheduleChore(chore2_group1);<a name="line.720"></a>
+<span class="sourceLineNo">721</span>      service.scheduleChore(chore3_group1);<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      service.scheduleChore(chore1_group2);<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      service.scheduleChore(chore2_group2);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      service.scheduleChore(chore3_group2);<a name="line.724"></a>
+<span class="sourceLineNo">725</span><a name="line.725"></a>
+<span class="sourceLineNo">726</span>      Thread.sleep(delta);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      Thread.sleep(10 * period);<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      assertTrue(chore1_group1.isScheduled());<a name="line.728"></a>
+<span class="sourceLineNo">729</span>      assertTrue(chore2_group1.isScheduled());<a name="line.729"></a>
+<span class="sourceLineNo">730</span>      assertTrue(chore3_group1.isScheduled());<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      assertTrue(chore1_group2.isScheduled());<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      assertTrue(chore2_group2.isScheduled());<a name="line.732"></a>
+<span class="sourceLineNo">733</span>      assertTrue(chore3_group2.isScheduled());<a name="line.733"></a>
+<span class="sourceLineNo">734</span><a name="line.734"></a>
+<span class="sourceLineNo">735</span>      stopperForGroup1.stop("test stopping group 1");<a name="line.735"></a>
+<span class="sourceLineNo">736</span>      Thread.sleep(period);<a name="line.736"></a>
+<span class="sourceLineNo">737</span>      assertFalse(chore1_group1.isScheduled());<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      assertFalse(chore2_group1.isScheduled());<a name="line.738"></a>
+<span class="sourceLineNo">739</span>      assertFalse(chore3_group1.isScheduled());<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      assertTrue(chore1_group2.isScheduled());<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      assertTrue(chore2_group2.isScheduled());<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      assertTrue(chore3_group2.isScheduled());<a name="line.742"></a>
+<span class="sourceLineNo">743</span><a name="line.743"></a>
+<span class="sourceLineNo">744</span>      stopperForGroup2.stop("test stopping group 2");<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      Thread.sleep(period);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      assertFalse(chore1_group1.isScheduled());<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      assertFalse(chore2_group1.isScheduled());<a name="line.747"></a>
+<span class="sourceLineNo">748</span>      assertFalse(chore3_group1.isScheduled());<a name="line.748"></a>
+<span class="sourceLineNo">749</span>      assertFalse(chore1_group2.isScheduled());<a name="line.749"></a>
+<span class="sourceLineNo">750</span>      assertFalse(chore2_group2.isScheduled());<a name="line.750"></a>
+<span class="sourceLineNo">751</span>      assertFalse(chore3_group2.isScheduled());<a name="line.751"></a>
+<span class="sourceLineNo">752</span>    } finally {<a name="line.752"></a>
+<span class="sourceLineNo">753</span>      shutdownService(service);<a name="line.753"></a>
+<span class="sourceLineNo">754</span>    }<a name="line.754"></a>
+<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>  @Test<a name="line.757"></a>
+<span class="sourceLineNo">758</span>  public void testShutdownCancelsScheduledChores() throws InterruptedException {<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    final int period = 100;<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    ChoreService service = new ChoreService("testShutdownCancelsScheduledChores");<a name="line.760"></a>
+<span class="sourceLineNo">761</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.761"></a>
+<span class="sourceLineNo">762</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.762"></a>
+<span class="sourceLineNo">763</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.763"></a>
+<span class="sourceLineNo">764</span><a name="line.764"></a>
+<span class="sourceLineNo">765</span>    try {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      assertTrue(successChore1.isScheduled());<a name="line.767"></a>
+<span class="sourceLineNo">768</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.768"></a>
+<span class="sourceLineNo">769</span>      assertTrue(successChore2.isScheduled());<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.770"></a>
+<span class="sourceLineNo">771</span>      assertTrue(successChore3.isScheduled());<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    } finally {<a name="line.772"></a>
+<span class="sourceLineNo">773</span>      shutdownService(service);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>    assertFalse(successChore1.isScheduled());<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    assertFalse(successChore2.isScheduled());<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    assertFalse(successChore3.isScheduled());<a name="line.778"></a>
+<span class="sourceLineNo">779</span>  }<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>  @Test<a name="line.781"></a>
+<span class="sourceLineNo">782</span>  public void testShutdownWorksWhileChoresAreExecuting() throws InterruptedException {<a name="line.782"></a>
+<span class="sourceLineNo">783</span>    final int period = 100;<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    final int sleep = 5 * period;<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    ChoreService service = new ChoreService("testShutdownWorksWhileChoresAreExecuting");<a name="line.785"></a>
+<span class="sourceLineNo">786</span>    ScheduledChore slowChore1 = new SleepingChore("sc1", period, sleep);<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    ScheduledChore slowChore2 = new SleepingChore("sc2", period, sleep);<a name="line.787"></a>
+<span class="sourceLineNo">788</span>    ScheduledChore slowChore3 = new SleepingChore("sc3", period, sleep);<a name="line.788"></a>
+<span class="sourceLineNo">789</span>    try {<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      assertTrue(service.scheduleChore(slowChore1));<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      assertTrue(service.scheduleChore(slowChore2));<a name="line.791"></a>
+<span class="sourceLineNo">792</span>      assertTrue(service.scheduleChore(slowChore3));<a name="line.792"></a>
+<span class="sourceLineNo">793</span><a name="line.793"></a>
+<span class="sourceLineNo">794</span>      Thread.sleep(sleep / 2);<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      shutdownService(service);<a name="line.795"></a>
+<span class="sourceLineNo">796</span><a name="line.796"></a>
+<span class="sourceLineNo">797</span>      assertFalse(slowChore1.isScheduled());<a name="line.797"></a>
+<span class="sourceLineNo">798</span>      assertFalse(slowChore2.isScheduled());<a name="line.798"></a>
+<span class="sourceLineNo">799</span>      assertFalse(slowChore3.isScheduled());<a name="line.799"></a>
+<span class="sourceLineNo">800</span>      assertTrue(service.isShutdown());<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>      Thread.sleep(5);<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      assertTrue(service.isTerminated());<a name="line.803"></a>
+<span class="sourceLineNo">804</span>    } finally {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>      shutdownService(service);<a name="line.805"></a>
+<span class="sourceLineNo">806</span>    }<a name="line.806"></a>
+<span class="sourceLineNo">807</span>  }<a name="line.807"></a>
+<span class="sourceLineNo">808</span><a name="line.808"></a>
+<span class="sourceLineNo">809</span>  @Test<a name="line.809"></a>
+<span class="sourceLineNo">810</span>  public void testShutdownRejectsNewSchedules() throws InterruptedException {<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    final int period = 100;<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    ChoreService service = new ChoreService("testShutdownRejectsNewSchedules");<a name="line.812"></a>
+<span class="sourceLineNo">813</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    ScheduledChore failChore1 = new DoNothingChore("fc1", period);<a name="line.816"></a>
+<span class="sourceLineNo">817</span>    ScheduledChore failChore2 = new DoNothingChore("fc2", period);<a name="line.817"></a>
+<span class="sourceLineNo">818</span>    ScheduledChore failChore3 = new DoNothingChore("fc3", period);<a name="line.818"></a>
+<span class="sourceLineNo">819</span><a name="line.819"></a>
+<span class="sourceLineNo">820</span>    try {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      assertTrue(successChore1.isScheduled());<a name="line.822"></a>
+<span class="sourceLineNo">823</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.823"></a>
+<span class="sourceLineNo">824</span>      assertTrue(successChore2.isScheduled());<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      assertTrue(successChore3.isScheduled());<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    } finally {<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      shutdownService(service);<a name="line.828"></a>
+<span class="sourceLineNo">829</span>    }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>    assertFalse(service.scheduleChore(failChore1));<a name="line.831"></a>
+<span class="sourceLineNo">832</span>    assertFalse(failChore1.isScheduled());<a name="line.832"></a>
+<span class="sourceLineNo">833</span>    assertFalse(service.scheduleChore(failChore2));<a name="line.833"></a>
+<span class="sourceLineNo">834</span>    assertFalse(failChore2.isScheduled());<a name="line.834"></a>
+<span class="sourceLineNo">835</span>    assertFalse(service.scheduleChore(failChore3));<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    assertFalse(failChore3.isScheduled());<a name="line.836"></a>
+<span class="sourceLineNo">837</span>  }<a name="line.837"></a>
+<span class="sourceLineNo">838</span>}<a name="line.838"></a>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.FailInitialChore.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.FailInitialChore.html
index 139ba2f..4fa763e 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.FailInitialChore.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.FailInitialChore.html
@@ -362,17 +362,17 @@
 <span class="sourceLineNo">354</span>  public void testFrequencyOfChores() throws InterruptedException {<a name="line.354"></a>
 <span class="sourceLineNo">355</span>    final int period = 100;<a name="line.355"></a>
 <span class="sourceLineNo">356</span>    // Small delta that acts as time buffer (allowing chores to complete if running slowly)<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    final int delta = 5;<a name="line.357"></a>
+<span class="sourceLineNo">357</span>    final int delta = period/5;<a name="line.357"></a>
 <span class="sourceLineNo">358</span>    ChoreService service = new ChoreService("testFrequencyOfChores");<a name="line.358"></a>
 <span class="sourceLineNo">359</span>    CountingChore chore = new CountingChore("countingChore", period);<a name="line.359"></a>
 <span class="sourceLineNo">360</span>    try {<a name="line.360"></a>
 <span class="sourceLineNo">361</span>      service.scheduleChore(chore);<a name="line.361"></a>
 <span class="sourceLineNo">362</span><a name="line.362"></a>
 <span class="sourceLineNo">363</span>      Thread.sleep(10 * period + delta);<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      assertTrue(chore.getCountOfChoreCalls() == 11);<a name="line.364"></a>
+<span class="sourceLineNo">364</span>      assertEquals("10 periods have elapsed.", 11, chore.getCountOfChoreCalls());<a name="line.364"></a>
 <span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>      Thread.sleep(10 * period);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      assertTrue(chore.getCountOfChoreCalls() == 21);<a name="line.367"></a>
+<span class="sourceLineNo">366</span>      Thread.sleep(10 * period + delta);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      assertEquals("20 periods have elapsed.", 21, chore.getCountOfChoreCalls());<a name="line.367"></a>
 <span class="sourceLineNo">368</span>    } finally {<a name="line.368"></a>
 <span class="sourceLineNo">369</span>      shutdownService(service);<a name="line.369"></a>
 <span class="sourceLineNo">370</span>    }<a name="line.370"></a>
@@ -388,14 +388,14 @@
 <span class="sourceLineNo">380</span>  @Test<a name="line.380"></a>
 <span class="sourceLineNo">381</span>  public void testForceTrigger() throws InterruptedException {<a name="line.381"></a>
 <span class="sourceLineNo">382</span>    final int period = 100;<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    final int delta = 10;<a name="line.383"></a>
+<span class="sourceLineNo">383</span>    final int delta = period/10;<a name="line.383"></a>
 <span class="sourceLineNo">384</span>    ChoreService service = new ChoreService("testForceTrigger");<a name="line.384"></a>
 <span class="sourceLineNo">385</span>    final CountingChore chore = new CountingChore("countingChore", period);<a name="line.385"></a>
 <span class="sourceLineNo">386</span>    try {<a name="line.386"></a>
 <span class="sourceLineNo">387</span>      service.scheduleChore(chore);<a name="line.387"></a>
 <span class="sourceLineNo">388</span>      Thread.sleep(10 * period + delta);<a name="line.388"></a>
 <span class="sourceLineNo">389</span><a name="line.389"></a>
-<span class="sourceLineNo">390</span>      assertTrue(chore.getCountOfChoreCalls() == 11);<a name="line.390"></a>
+<span class="sourceLineNo">390</span>      assertEquals("10 periods have elapsed.", 11, chore.getCountOfChoreCalls());<a name="line.390"></a>
 <span class="sourceLineNo">391</span><a name="line.391"></a>
 <span class="sourceLineNo">392</span>      // Force five runs of the chore to occur, sleeping between triggers to ensure the<a name="line.392"></a>
 <span class="sourceLineNo">393</span>      // chore has time to run<a name="line.393"></a>
@@ -410,438 +410,440 @@
 <span class="sourceLineNo">402</span>      chore.triggerNow();<a name="line.402"></a>
 <span class="sourceLineNo">403</span>      Thread.sleep(delta);<a name="line.403"></a>
 <span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>      assertTrue("" + chore.getCountOfChoreCalls(), chore.getCountOfChoreCalls() == 16);<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>      Thread.sleep(10 * period + delta);<a name="line.407"></a>
-<span class="sourceLineNo">408</span><a name="line.408"></a>
-<span class="sourceLineNo">409</span>      // Be loosey-goosey. It used to be '26' but it was a big flakey relying on timing.<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      assertTrue("" + chore.getCountOfChoreCalls(), chore.getCountOfChoreCalls() &gt; 16);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    } finally {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      shutdownService(service);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  @Test<a name="line.416"></a>
-<span class="sourceLineNo">417</span>  public void testCorePoolIncrease() throws InterruptedException {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    final int initialCorePoolSize = 3;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    ChoreService service = new ChoreService("testCorePoolIncrease", initialCorePoolSize, false);<a name="line.419"></a>
-<span class="sourceLineNo">420</span><a name="line.420"></a>
-<span class="sourceLineNo">421</span>    try {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      assertEquals("Should have a core pool of size: " + initialCorePoolSize, initialCorePoolSize,<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        service.getCorePoolSize());<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>      final int slowChorePeriod = 100;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      SlowChore slowChore1 = new SlowChore("slowChore1", slowChorePeriod);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      SlowChore slowChore2 = new SlowChore("slowChore2", slowChorePeriod);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      SlowChore slowChore3 = new SlowChore("slowChore3", slowChorePeriod);<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>      service.scheduleChore(slowChore1);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      service.scheduleChore(slowChore2);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      service.scheduleChore(slowChore3);<a name="line.432"></a>
-<span class="sourceLineNo">433</span><a name="line.433"></a>
-<span class="sourceLineNo">434</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      assertEquals("Should not create more pools than scheduled chores", 3,<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        service.getCorePoolSize());<a name="line.436"></a>
-<span class="sourceLineNo">437</span><a name="line.437"></a>
-<span class="sourceLineNo">438</span>      SlowChore slowChore4 = new SlowChore("slowChore4", slowChorePeriod);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      service.scheduleChore(slowChore4);<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 4,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        service.getCorePoolSize());<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>      SlowChore slowChore5 = new SlowChore("slowChore5", slowChorePeriod);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      service.scheduleChore(slowChore5);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 5,<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        service.getCorePoolSize());<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    } finally {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      shutdownService(service);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>  @Test<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  public void testCorePoolDecrease() throws InterruptedException {<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    final int initialCorePoolSize = 3;<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    ChoreService service = new ChoreService("testCorePoolDecrease", initialCorePoolSize, false);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    final int chorePeriod = 100;<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    try {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      // Slow chores always miss their start time and thus the core pool size should be at least as<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      // large as the number of running slow chores<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      SlowChore slowChore1 = new SlowChore("slowChore1", chorePeriod);<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      SlowChore slowChore2 = new SlowChore("slowChore2", chorePeriod);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      SlowChore slowChore3 = new SlowChore("slowChore3", chorePeriod);<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>      service.scheduleChore(slowChore1);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      service.scheduleChore(slowChore2);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      service.scheduleChore(slowChore3);<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>      Thread.sleep(chorePeriod * 10);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      assertEquals("Should not create more pools than scheduled chores",<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.474"></a>
-<span class="sourceLineNo">475</span><a name="line.475"></a>
-<span class="sourceLineNo">476</span>      SlowChore slowChore4 = new SlowChore("slowChore4", chorePeriod);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      service.scheduleChore(slowChore4);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      Thread.sleep(chorePeriod * 10);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>      SlowChore slowChore5 = new SlowChore("slowChore5", chorePeriod);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      service.scheduleChore(slowChore5);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      Thread.sleep(chorePeriod * 10);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.485"></a>
-<span class="sourceLineNo">486</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.487"></a>
-<span class="sourceLineNo">488</span><a name="line.488"></a>
-<span class="sourceLineNo">489</span>      // Now we begin to cancel the chores that caused an increase in the core thread pool of the<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      // ChoreService. These cancellations should cause a decrease in the core thread pool.<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      slowChore5.cancel();<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      Thread.sleep(chorePeriod * 10);<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        service.getCorePoolSize());<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>      slowChore4.cancel();<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      Thread.sleep(chorePeriod * 10);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        service.getCorePoolSize());<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      assertEquals(3, service.getNumberOfChoresMissingStartTime());<a name="line.501"></a>
-<span class="sourceLineNo">502</span><a name="line.502"></a>
-<span class="sourceLineNo">503</span>      slowChore3.cancel();<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      Thread.sleep(chorePeriod * 10);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.505"></a>
-<span class="sourceLineNo">506</span>        service.getCorePoolSize());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      assertEquals(2, service.getNumberOfChoresMissingStartTime());<a name="line.507"></a>
-<span class="sourceLineNo">508</span><a name="line.508"></a>
-<span class="sourceLineNo">509</span>      slowChore2.cancel();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      Thread.sleep(chorePeriod * 10);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.511"></a>
-<span class="sourceLineNo">512</span>        service.getCorePoolSize());<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>      slowChore1.cancel();<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      Thread.sleep(chorePeriod * 10);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.517"></a>
-<span class="sourceLineNo">518</span>        service.getCorePoolSize());<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    } finally {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      shutdownService(service);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>  }<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>  @Test<a name="line.525"></a>
-<span class="sourceLineNo">526</span>  public void testNumberOfRunningChores() throws InterruptedException {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    ChoreService service = new ChoreService("testNumberOfRunningChores");<a name="line.527"></a>
-<span class="sourceLineNo">528</span><a name="line.528"></a>
-<span class="sourceLineNo">529</span>    final int period = 100;<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    final int sleepTime = 5;<a name="line.530"></a>
-<span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>    try {<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      DoNothingChore dn1 = new DoNothingChore("dn1", period);<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      DoNothingChore dn2 = new DoNothingChore("dn2", period);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      DoNothingChore dn3 = new DoNothingChore("dn3", period);<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      DoNothingChore dn4 = new DoNothingChore("dn4", period);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      DoNothingChore dn5 = new DoNothingChore("dn5", period);<a name="line.537"></a>
-<span class="sourceLineNo">538</span><a name="line.538"></a>
-<span class="sourceLineNo">539</span>      service.scheduleChore(dn1);<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      service.scheduleChore(dn2);<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      service.scheduleChore(dn3);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      service.scheduleChore(dn4);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      service.scheduleChore(dn5);<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>      Thread.sleep(sleepTime);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      assertEquals("Scheduled chore mismatch", 5, service.getNumberOfScheduledChores());<a name="line.546"></a>
-<span class="sourceLineNo">547</span><a name="line.547"></a>
-<span class="sourceLineNo">548</span>      dn1.cancel();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      Thread.sleep(sleepTime);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      assertEquals("Scheduled chore mismatch", 4, service.getNumberOfScheduledChores());<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>      dn2.cancel();<a name="line.552"></a>
-<span class="sourceLineNo">553</span>      dn3.cancel();<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      dn4.cancel();<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      Thread.sleep(sleepTime);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      assertEquals("Scheduled chore mismatch", 1, service.getNumberOfScheduledChores());<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>      dn5.cancel();<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      Thread.sleep(sleepTime);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      assertEquals("Scheduled chore mismatch", 0, service.getNumberOfScheduledChores());<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    } finally {<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      shutdownService(service);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    }<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  }<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>  @Test<a name="line.566"></a>
-<span class="sourceLineNo">567</span>  public void testNumberOfChoresMissingStartTime() throws InterruptedException {<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    ChoreService service = new ChoreService("testNumberOfChoresMissingStartTime");<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>    final int period = 100;<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    final int sleepTime = 5 * period;<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    try {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      // ALWAYS miss their start time since their execution takes longer than their period<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.580"></a>
-<span class="sourceLineNo">581</span><a name="line.581"></a>
-<span class="sourceLineNo">582</span>      service.scheduleChore(sc1);<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      service.scheduleChore(sc2);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      service.scheduleChore(sc3);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      service.scheduleChore(sc4);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      service.scheduleChore(sc5);<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>      Thread.sleep(sleepTime);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.589"></a>
-<span class="sourceLineNo">590</span><a name="line.590"></a>
-<span class="sourceLineNo">591</span>      sc1.cancel();<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      Thread.sleep(sleepTime);<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.593"></a>
-<span class="sourceLineNo">594</span><a name="line.594"></a>
-<span class="sourceLineNo">595</span>      sc2.cancel();<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      sc3.cancel();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      sc4.cancel();<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      Thread.sleep(sleepTime);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>      sc5.cancel();<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      Thread.sleep(sleepTime);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    } finally {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      shutdownService(service);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  }<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>  /**<a name="line.609"></a>
-<span class="sourceLineNo">610</span>   * ChoreServices should never have a core pool size that exceeds the number of chores that have<a name="line.610"></a>
-<span class="sourceLineNo">611</span>   * been scheduled with the service. For example, if 4 ScheduledChores are scheduled with a<a name="line.611"></a>
-<span class="sourceLineNo">612</span>   * ChoreService, the number of threads in the ChoreService's core pool should never exceed 4<a name="line.612"></a>
-<span class="sourceLineNo">613</span>   */<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  @Test<a name="line.614"></a>
-<span class="sourceLineNo">615</span>  public void testMaximumChoreServiceThreads() throws InterruptedException {<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    ChoreService service = new ChoreService("testMaximumChoreServiceThreads");<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>    final int period = 100;<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    final int sleepTime = 5 * period;<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>    try {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.622"></a>
-<span class="sourceLineNo">623</span>      // ALWAYS miss their start time since their execution takes longer than their period.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      // Chores that miss their start time will trigger the onChoreMissedStartTime callback<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      // in the ChoreService. This callback will try to increase the number of core pool<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      // threads.<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.628"></a>
-<span class="sourceLineNo">629</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.631"></a>
-<span class="sourceLineNo">632</span><a name="line.632"></a>
-<span class="sourceLineNo">633</span>      service.scheduleChore(sc1);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      service.scheduleChore(sc2);<a name="line.634"></a>
-<span class="sourceLineNo">635</span>      service.scheduleChore(sc3);<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      service.scheduleChore(sc4);<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      service.scheduleChore(sc5);<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>      Thread.sleep(sleepTime);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>      SlowChore sc6 = new SlowChore("sc6", period);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      SlowChore sc7 = new SlowChore("sc7", period);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      SlowChore sc8 = new SlowChore("sc8", period);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      SlowChore sc9 = new SlowChore("sc9", period);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      SlowChore sc10 = new SlowChore("sc10", period);<a name="line.646"></a>
-<span class="sourceLineNo">647</span><a name="line.647"></a>
-<span class="sourceLineNo">648</span>      service.scheduleChore(sc6);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      service.scheduleChore(sc7);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      service.scheduleChore(sc8);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      service.scheduleChore(sc9);<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      service.scheduleChore(sc10);<a name="line.652"></a>
-<span class="sourceLineNo">653</span><a name="line.653"></a>
-<span class="sourceLineNo">654</span>      Thread.sleep(sleepTime);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    } finally {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      shutdownService(service);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    }<a name="line.658"></a>
-<span class="sourceLineNo">659</span>  }<a name="line.659"></a>
-<span class="sourceLineNo">660</span><a name="line.660"></a>
-<span class="sourceLineNo">661</span>  @Test<a name="line.661"></a>
-<span class="sourceLineNo">662</span>  public void testChangingChoreServices() throws InterruptedException {<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    final int period = 100;<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    final int sleepTime = 10;<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    ChoreService service1 = new ChoreService("testChangingChoreServices_1");<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    ChoreService service2 = new ChoreService("testChangingChoreServices_2");<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    ScheduledChore chore = new DoNothingChore("sample", period);<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    try {<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      assertFalse(chore.isScheduled());<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.673"></a>
-<span class="sourceLineNo">674</span><a name="line.674"></a>
-<span class="sourceLineNo">675</span>      service1.scheduleChore(chore);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      Thread.sleep(sleepTime);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      assertTrue(chore.isScheduled());<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      assertTrue(service1.isChoreScheduled(chore));<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>      service2.scheduleChore(chore);<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      Thread.sleep(sleepTime);<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      assertTrue(chore.isScheduled());<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      assertTrue(service2.isChoreScheduled(chore));<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.687"></a>
-<span class="sourceLineNo">688</span><a name="line.688"></a>
-<span class="sourceLineNo">689</span>      chore.cancel();<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      assertFalse(chore.isScheduled());<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    } finally {<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      shutdownService(service1);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      shutdownService(service2);<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span>  }<a name="line.698"></a>
-<span class="sourceLineNo">699</span><a name="line.699"></a>
-<span class="sourceLineNo">700</span>  @Test<a name="line.700"></a>
-<span class="sourceLineNo">701</span>  public void testStopperForScheduledChores() throws InterruptedException {<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    ChoreService service = new ChoreService("testStopperForScheduledChores");<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    Stoppable stopperForGroup1 = new SampleStopper();<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    Stoppable stopperForGroup2 = new SampleStopper();<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    final int period = 100;<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    final int delta = 10;<a name="line.706"></a>
-<span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    try {<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      ScheduledChore chore1_group1 = new DoNothingChore("c1g1", stopperForGroup1, period);<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      ScheduledChore chore2_group1 = new DoNothingChore("c2g1", stopperForGroup1, period);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      ScheduledChore chore3_group1 = new DoNothingChore("c3g1", stopperForGroup1, period);<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      ScheduledChore chore1_group2 = new DoNothingChore("c1g2", stopperForGroup2, period);<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      ScheduledChore chore2_group2 = new DoNothingChore("c2g2", stopperForGroup2, period);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      ScheduledChore chore3_group2 = new DoNothingChore("c3g2", stopperForGroup2, period);<a name="line.715"></a>
-<span class="sourceLineNo">716</span><a name="line.716"></a>
-<span class="sourceLineNo">717</span>      service.scheduleChore(chore1_group1);<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      service.scheduleChore(chore2_group1);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      service.scheduleChore(chore3_group1);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      service.scheduleChore(chore1_group2);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      service.scheduleChore(chore2_group2);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      service.scheduleChore(chore3_group2);<a name="line.722"></a>
-<span class="sourceLineNo">723</span><a name="line.723"></a>
-<span class="sourceLineNo">724</span>      Thread.sleep(delta);<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      Thread.sleep(10 * period);<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      assertTrue(chore1_group1.isScheduled());<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      assertTrue(chore2_group1.isScheduled());<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      assertTrue(chore3_group1.isScheduled());<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      assertTrue(chore1_group2.isScheduled());<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      assertTrue(chore2_group2.isScheduled());<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      assertTrue(chore3_group2.isScheduled());<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>      stopperForGroup1.stop("test stopping group 1");<a name="line.733"></a>
-<span class="sourceLineNo">734</span>      Thread.sleep(period);<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      assertFalse(chore1_group1.isScheduled());<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      assertFalse(chore2_group1.isScheduled());<a name="line.736"></a>
-<span class="sourceLineNo">737</span>      assertFalse(chore3_group1.isScheduled());<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      assertTrue(chore1_group2.isScheduled());<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      assertTrue(chore2_group2.isScheduled());<a name="line.739"></a>
-<span class="sourceLineNo">740</span>      assertTrue(chore3_group2.isScheduled());<a name="line.740"></a>
-<span class="sourceLineNo">741</span><a name="line.741"></a>
-<span class="sourceLineNo">742</span>      stopperForGroup2.stop("test stopping group 2");<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      Thread.sleep(period);<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      assertFalse(chore1_group1.isScheduled());<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      assertFalse(chore2_group1.isScheduled());<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      assertFalse(chore3_group1.isScheduled());<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      assertFalse(chore1_group2.isScheduled());<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      assertFalse(chore2_group2.isScheduled());<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      assertFalse(chore3_group2.isScheduled());<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    } finally {<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      shutdownService(service);<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    }<a name="line.752"></a>
-<span class="sourceLineNo">753</span>  }<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>  @Test<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public void testShutdownCancelsScheduledChores() throws InterruptedException {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>    final int period = 100;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    ChoreService service = new ChoreService("testShutdownCancelsScheduledChores");<a name="line.758"></a>
-<span class="sourceLineNo">759</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.761"></a>
-<span class="sourceLineNo">762</span><a name="line.762"></a>
-<span class="sourceLineNo">763</span>    try {<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      assertTrue(successChore1.isScheduled());<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.766"></a>
-<span class="sourceLineNo">767</span>      assertTrue(successChore2.isScheduled());<a name="line.767"></a>
-<span class="sourceLineNo">768</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      assertTrue(successChore3.isScheduled());<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    } finally {<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      shutdownService(service);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    }<a name="line.772"></a>
-<span class="sourceLineNo">773</span><a name="line.773"></a>
-<span class="sourceLineNo">774</span>    assertFalse(successChore1.isScheduled());<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    assertFalse(successChore2.isScheduled());<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    assertFalse(successChore3.isScheduled());<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  @Test<a name="line.779"></a>
-<span class="sourceLineNo">780</span>  public void testShutdownWorksWhileChoresAreExecuting() throws InterruptedException {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    final int period = 100;<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    final int sleep = 5 * period;<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    ChoreService service = new ChoreService("testShutdownWorksWhileChoresAreExecuting");<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    ScheduledChore slowChore1 = new SleepingChore("sc1", period, sleep);<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    ScheduledChore slowChore2 = new SleepingChore("sc2", period, sleep);<a name="line.785"></a>
-<span class="sourceLineNo">786</span>    ScheduledChore slowChore3 = new SleepingChore("sc3", period, sleep);<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    try {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      assertTrue(service.scheduleChore(slowChore1));<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      assertTrue(service.scheduleChore(slowChore2));<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      assertTrue(service.scheduleChore(slowChore3));<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>      Thread.sleep(sleep / 2);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>      shutdownService(service);<a name="line.793"></a>
-<span class="sourceLineNo">794</span><a name="line.794"></a>
-<span class="sourceLineNo">795</span>      assertFalse(slowChore1.isScheduled());<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      assertFalse(slowChore2.isScheduled());<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      assertFalse(slowChore3.isScheduled());<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      assertTrue(service.isShutdown());<a name="line.798"></a>
-<span class="sourceLineNo">799</span><a name="line.799"></a>
-<span class="sourceLineNo">800</span>      Thread.sleep(5);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      assertTrue(service.isTerminated());<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    } finally {<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      shutdownService(service);<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    }<a name="line.804"></a>
-<span class="sourceLineNo">805</span>  }<a name="line.805"></a>
-<span class="sourceLineNo">806</span><a name="line.806"></a>
-<span class="sourceLineNo">807</span>  @Test<a name="line.807"></a>
-<span class="sourceLineNo">808</span>  public void testShutdownRejectsNewSchedules() throws InterruptedException {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    final int period = 100;<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    ChoreService service = new ChoreService("testShutdownRejectsNewSchedules");<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    ScheduledChore failChore1 = new DoNothingChore("fc1", period);<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    ScheduledChore failChore2 = new DoNothingChore("fc2", period);<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    ScheduledChore failChore3 = new DoNothingChore("fc3", period);<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>    try {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.819"></a>
-<span class="sourceLineNo">820</span>      assertTrue(successChore1.isScheduled());<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      assertTrue(successChore2.isScheduled());<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      assertTrue(successChore3.isScheduled());<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    } finally {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      shutdownService(service);<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>    assertFalse(service.scheduleChore(failChore1));<a name="line.829"></a>
-<span class="sourceLineNo">830</span>    assertFalse(failChore1.isScheduled());<a name="line.830"></a>
-<span class="sourceLineNo">831</span>    assertFalse(service.scheduleChore(failChore2));<a name="line.831"></a>
-<span class="sourceLineNo">832</span>    assertFalse(failChore2.isScheduled());<a name="line.832"></a>
-<span class="sourceLineNo">833</span>    assertFalse(service.scheduleChore(failChore3));<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    assertFalse(failChore3.isScheduled());<a name="line.834"></a>
-<span class="sourceLineNo">835</span>  }<a name="line.835"></a>
-<span class="sourceLineNo">836</span>}<a name="line.836"></a>
+<span class="sourceLineNo">405</span>      assertEquals("Trigger was called 5 times after 10 periods.", 16,<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          chore.getCountOfChoreCalls());<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>      Thread.sleep(10 * period + delta);<a name="line.408"></a>
+<span class="sourceLineNo">409</span><a name="line.409"></a>
+<span class="sourceLineNo">410</span>      // Be loosey-goosey. It used to be '26' but it was a big flakey relying on timing.<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      assertTrue("Expected at least 16 invocations, instead got " + chore.getCountOfChoreCalls(),<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          chore.getCountOfChoreCalls() &gt; 16);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    } finally {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      shutdownService(service);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    }<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  }<a name="line.416"></a>
+<span class="sourceLineNo">417</span><a name="line.417"></a>
+<span class="sourceLineNo">418</span>  @Test<a name="line.418"></a>
+<span class="sourceLineNo">419</span>  public void testCorePoolIncrease() throws InterruptedException {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    final int initialCorePoolSize = 3;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    ChoreService service = new ChoreService("testCorePoolIncrease", initialCorePoolSize, false);<a name="line.421"></a>
+<span class="sourceLineNo">422</span><a name="line.422"></a>
+<span class="sourceLineNo">423</span>    try {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>      assertEquals("Setting core pool size gave unexpected results.", initialCorePoolSize,<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        service.getCorePoolSize());<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>      final int slowChorePeriod = 100;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      SlowChore slowChore1 = new SlowChore("slowChore1", slowChorePeriod);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      SlowChore slowChore2 = new SlowChore("slowChore2", slowChorePeriod);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>      SlowChore slowChore3 = new SlowChore("slowChore3", slowChorePeriod);<a name="line.430"></a>
+<span class="sourceLineNo">431</span><a name="line.431"></a>
+<span class="sourceLineNo">432</span>      service.scheduleChore(slowChore1);<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      service.scheduleChore(slowChore2);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      service.scheduleChore(slowChore3);<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      assertEquals("Should not create more pools than scheduled chores", 3,<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        service.getCorePoolSize());<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>      SlowChore slowChore4 = new SlowChore("slowChore4", slowChorePeriod);<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      service.scheduleChore(slowChore4);<a name="line.441"></a>
+<span class="sourceLineNo">442</span><a name="line.442"></a>
+<span class="sourceLineNo">443</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 4,<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        service.getCorePoolSize());<a name="line.445"></a>
+<span class="sourceLineNo">446</span><a name="line.446"></a>
+<span class="sourceLineNo">447</span>      SlowChore slowChore5 = new SlowChore("slowChore5", slowChorePeriod);<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      service.scheduleChore(slowChore5);<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 5,<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        service.getCorePoolSize());<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    } finally {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      shutdownService(service);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
+<span class="sourceLineNo">457</span><a name="line.457"></a>
+<span class="sourceLineNo">458</span>  @Test<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  public void testCorePoolDecrease() throws InterruptedException {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    final int initialCorePoolSize = 3;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    ChoreService service = new ChoreService("testCorePoolDecrease", initialCorePoolSize, false);<a name="line.461"></a>
+<span class="sourceLineNo">462</span>    final int chorePeriod = 100;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    try {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>      // Slow chores always miss their start time and thus the core pool size should be at least as<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      // large as the number of running slow chores<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      SlowChore slowChore1 = new SlowChore("slowChore1", chorePeriod);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      SlowChore slowChore2 = new SlowChore("slowChore2", chorePeriod);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      SlowChore slowChore3 = new SlowChore("slowChore3", chorePeriod);<a name="line.468"></a>
+<span class="sourceLineNo">469</span><a name="line.469"></a>
+<span class="sourceLineNo">470</span>      service.scheduleChore(slowChore1);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      service.scheduleChore(slowChore2);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>      service.scheduleChore(slowChore3);<a name="line.472"></a>
+<span class="sourceLineNo">473</span><a name="line.473"></a>
+<span class="sourceLineNo">474</span>      Thread.sleep(chorePeriod * 10);<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      assertEquals("Should not create more pools than scheduled chores",<a name="line.475"></a>
+<span class="sourceLineNo">476</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>      SlowChore slowChore4 = new SlowChore("slowChore4", chorePeriod);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      service.scheduleChore(slowChore4);<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      Thread.sleep(chorePeriod * 10);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.481"></a>
+<span class="sourceLineNo">482</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>      SlowChore slowChore5 = new SlowChore("slowChore5", chorePeriod);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      service.scheduleChore(slowChore5);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      Thread.sleep(chorePeriod * 10);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.487"></a>
+<span class="sourceLineNo">488</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>      // Now we begin to cancel the chores that caused an increase in the core thread pool of the<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      // ChoreService. These cancellations should cause a decrease in the core thread pool.<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      slowChore5.cancel();<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      Thread.sleep(chorePeriod * 10);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.495"></a>
+<span class="sourceLineNo">496</span>        service.getCorePoolSize());<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.497"></a>
+<span class="sourceLineNo">498</span><a name="line.498"></a>
+<span class="sourceLineNo">499</span>      slowChore4.cancel();<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      Thread.sleep(chorePeriod * 10);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        service.getCorePoolSize());<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      assertEquals(3, service.getNumberOfChoresMissingStartTime());<a name="line.503"></a>
+<span class="sourceLineNo">504</span><a name="line.504"></a>
+<span class="sourceLineNo">505</span>      slowChore3.cancel();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      Thread.sleep(chorePeriod * 10);<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        service.getCorePoolSize());<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      assertEquals(2, service.getNumberOfChoresMissingStartTime());<a name="line.509"></a>
+<span class="sourceLineNo">510</span><a name="line.510"></a>
+<span class="sourceLineNo">511</span>      slowChore2.cancel();<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      Thread.sleep(chorePeriod * 10);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.513"></a>
+<span class="sourceLineNo">514</span>        service.getCorePoolSize());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.515"></a>
+<span class="sourceLineNo">516</span><a name="line.516"></a>
+<span class="sourceLineNo">517</span>      slowChore1.cancel();<a name="line.517"></a>
+<span class="sourceLineNo">518</span>      Thread.sleep(chorePeriod * 10);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.519"></a>
+<span class="sourceLineNo">520</span>        service.getCorePoolSize());<a name="line.520"></a>
+<span class="sourceLineNo">521</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    } finally {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      shutdownService(service);<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
+<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>  @Test<a name="line.527"></a>
+<span class="sourceLineNo">528</span>  public void testNumberOfRunningChores() throws InterruptedException {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    ChoreService service = new ChoreService("testNumberOfRunningChores");<a name="line.529"></a>
+<span class="sourceLineNo">530</span><a name="line.530"></a>
+<span class="sourceLineNo">531</span>    final int period = 100;<a name="line.531"></a>
+<span class="sourceLineNo">532</span>    final int sleepTime = 5;<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>    try {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      DoNothingChore dn1 = new DoNothingChore("dn1", period);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      DoNothingChore dn2 = new DoNothingChore("dn2", period);<a name="line.536"></a>
+<span class="sourceLineNo">537</span>      DoNothingChore dn3 = new DoNothingChore("dn3", period);<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      DoNothingChore dn4 = new DoNothingChore("dn4", period);<a name="line.538"></a>
+<span class="sourceLineNo">539</span>      DoNothingChore dn5 = new DoNothingChore("dn5", period);<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>      service.scheduleChore(dn1);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      service.scheduleChore(dn2);<a name="line.542"></a>
+<span class="sourceLineNo">543</span>      service.scheduleChore(dn3);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>      service.scheduleChore(dn4);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      service.scheduleChore(dn5);<a name="line.545"></a>
+<span class="sourceLineNo">546</span><a name="line.546"></a>
+<span class="sourceLineNo">547</span>      Thread.sleep(sleepTime);<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      assertEquals("Scheduled chore mismatch", 5, service.getNumberOfScheduledChores());<a name="line.548"></a>
+<span class="sourceLineNo">549</span><a name="line.549"></a>
+<span class="sourceLineNo">550</span>      dn1.cancel();<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      Thread.sleep(sleepTime);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      assertEquals("Scheduled chore mismatch", 4, service.getNumberOfScheduledChores());<a name="line.552"></a>
+<span class="sourceLineNo">553</span><a name="line.553"></a>
+<span class="sourceLineNo">554</span>      dn2.cancel();<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      dn3.cancel();<a name="line.555"></a>
+<span class="sourceLineNo">556</span>      dn4.cancel();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>      Thread.sleep(sleepTime);<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      assertEquals("Scheduled chore mismatch", 1, service.getNumberOfScheduledChores());<a name="line.558"></a>
+<span class="sourceLineNo">559</span><a name="line.559"></a>
+<span class="sourceLineNo">560</span>      dn5.cancel();<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      Thread.sleep(sleepTime);<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      assertEquals("Scheduled chore mismatch", 0, service.getNumberOfScheduledChores());<a name="line.562"></a>
+<span class="sourceLineNo">563</span>    } finally {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      shutdownService(service);<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    }<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  @Test<a name="line.568"></a>
+<span class="sourceLineNo">569</span>  public void testNumberOfChoresMissingStartTime() throws InterruptedException {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    ChoreService service = new ChoreService("testNumberOfChoresMissingStartTime");<a name="line.570"></a>
+<span class="sourceLineNo">571</span><a name="line.571"></a>
+<span class="sourceLineNo">572</span>    final int period = 100;<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    final int sleepTime = 5 * period;<a name="line.573"></a>
+<span class="sourceLineNo">574</span><a name="line.574"></a>
+<span class="sourceLineNo">575</span>    try {<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      // ALWAYS miss their start time since their execution takes longer than their period<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.578"></a>
+<span class="sourceLineNo">579</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.581"></a>
+<span class="sourceLineNo">582</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.582"></a>
+<span class="sourceLineNo">583</span><a name="line.583"></a>
+<span class="sourceLineNo">584</span>      service.scheduleChore(sc1);<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      service.scheduleChore(sc2);<a name="line.585"></a>
+<span class="sourceLineNo">586</span>      service.scheduleChore(sc3);<a name="line.586"></a>
+<span class="sourceLineNo">587</span>      service.scheduleChore(sc4);<a name="line.587"></a>
+<span class="sourceLineNo">588</span>      service.scheduleChore(sc5);<a name="line.588"></a>
+<span class="sourceLineNo">589</span><a name="line.589"></a>
+<span class="sourceLineNo">590</span>      Thread.sleep(sleepTime);<a name="line.590"></a>
+<span class="sourceLineNo">591</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.591"></a>
+<span class="sourceLineNo">592</span><a name="line.592"></a>
+<span class="sourceLineNo">593</span>      sc1.cancel();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>      Thread.sleep(sleepTime);<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>      sc2.cancel();<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      sc3.cancel();<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      sc4.cancel();<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      Thread.sleep(sleepTime);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.601"></a>
+<span class="sourceLineNo">602</span><a name="line.602"></a>
+<span class="sourceLineNo">603</span>      sc5.cancel();<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      Thread.sleep(sleepTime);<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.605"></a>
+<span class="sourceLineNo">606</span>    } finally {<a name="line.606"></a>
+<span class="sourceLineNo">607</span>      shutdownService(service);<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
+<span class="sourceLineNo">609</span>  }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>  /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>   * ChoreServices should never have a core pool size that exceeds the number of chores that have<a name="line.612"></a>
+<span class="sourceLineNo">613</span>   * been scheduled with the service. For example, if 4 ScheduledChores are scheduled with a<a name="line.613"></a>
+<span class="sourceLineNo">614</span>   * ChoreService, the number of threads in the ChoreService's core pool should never exceed 4<a name="line.614"></a>
+<span class="sourceLineNo">615</span>   */<a name="line.615"></a>
+<span class="sourceLineNo">616</span>  @Test<a name="line.616"></a>
+<span class="sourceLineNo">617</span>  public void testMaximumChoreServiceThreads() throws InterruptedException {<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    ChoreService service = new ChoreService("testMaximumChoreServiceThreads");<a name="line.618"></a>
+<span class="sourceLineNo">619</span><a name="line.619"></a>
+<span class="sourceLineNo">620</span>    final int period = 100;<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    final int sleepTime = 5 * period;<a name="line.621"></a>
+<span class="sourceLineNo">622</span><a name="line.622"></a>
+<span class="sourceLineNo">623</span>    try {<a name="line.623"></a>
+<span class="sourceLineNo">624</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      // ALWAYS miss their start time since their execution takes longer than their period.<a name="line.625"></a>
+<span class="sourceLineNo">626</span>      // Chores that miss their start time will trigger the onChoreMissedStartTime callback<a name="line.626"></a>
+<span class="sourceLineNo">627</span>      // in the ChoreService. This callback will try to increase the number of core pool<a name="line.627"></a>
+<span class="sourceLineNo">628</span>      // threads.<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.630"></a>
+<span class="sourceLineNo">631</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.631"></a>
+<span class="sourceLineNo">632</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.632"></a>
+<span class="sourceLineNo">633</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.633"></a>
+<span class="sourceLineNo">634</span><a name="line.634"></a>
+<span class="sourceLineNo">635</span>      service.scheduleChore(sc1);<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      service.scheduleChore(sc2);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      service.scheduleChore(sc3);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>      service.scheduleChore(sc4);<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      service.scheduleChore(sc5);<a name="line.639"></a>
+<span class="sourceLineNo">640</span><a name="line.640"></a>
+<span class="sourceLineNo">641</span>      Thread.sleep(sleepTime);<a name="line.641"></a>
+<span class="sourceLineNo">642</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>      SlowChore sc6 = new SlowChore("sc6", period);<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      SlowChore sc7 = new SlowChore("sc7", period);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>      SlowChore sc8 = new SlowChore("sc8", period);<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      SlowChore sc9 = new SlowChore("sc9", period);<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      SlowChore sc10 = new SlowChore("sc10", period);<a name="line.648"></a>
+<span class="sourceLineNo">649</span><a name="line.649"></a>
+<span class="sourceLineNo">650</span>      service.scheduleChore(sc6);<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      service.scheduleChore(sc7);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      service.scheduleChore(sc8);<a name="line.652"></a>
+<span class="sourceLineNo">653</span>      service.scheduleChore(sc9);<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      service.scheduleChore(sc10);<a name="line.654"></a>
+<span class="sourceLineNo">655</span><a name="line.655"></a>
+<span class="sourceLineNo">656</span>      Thread.sleep(sleepTime);<a name="line.656"></a>
+<span class="sourceLineNo">657</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    } finally {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>      shutdownService(service);<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    }<a name="line.660"></a>
+<span class="sourceLineNo">661</span>  }<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>  @Test<a name="line.663"></a>
+<span class="sourceLineNo">664</span>  public void testChangingChoreServices() throws InterruptedException {<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    final int period = 100;<a name="line.665"></a>
+<span class="sourceLineNo">666</span>    final int sleepTime = 10;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    ChoreService service1 = new ChoreService("testChangingChoreServices_1");<a name="line.667"></a>
+<span class="sourceLineNo">668</span>    ChoreService service2 = new ChoreService("testChangingChoreServices_2");<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    ScheduledChore chore = new DoNothingChore("sample", period);<a name="line.669"></a>
+<span class="sourceLineNo">670</span><a name="line.670"></a>
+<span class="sourceLineNo">671</span>    try {<a name="line.671"></a>
+<span class="sourceLineNo">672</span>      assertFalse(chore.isScheduled());<a name="line.672"></a>
+<span class="sourceLineNo">673</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>      service1.scheduleChore(chore);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>      Thread.sleep(sleepTime);<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      assertTrue(chore.isScheduled());<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      assertTrue(service1.isChoreScheduled(chore));<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.682"></a>
+<span class="sourceLineNo">683</span><a name="line.683"></a>
+<span class="sourceLineNo">684</span>      service2.scheduleChore(chore);<a name="line.684"></a>
+<span class="sourceLineNo">685</span>      Thread.sleep(sleepTime);<a name="line.685"></a>
+<span class="sourceLineNo">686</span>      assertTrue(chore.isScheduled());<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.687"></a>
+<span class="sourceLineNo">688</span>      assertTrue(service2.isChoreScheduled(chore));<a name="line.688"></a>
+<span class="sourceLineNo">689</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.689"></a>
+<span class="sourceLineNo">690</span><a name="line.690"></a>
+<span class="sourceLineNo">691</span>      chore.cancel();<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      assertFalse(chore.isScheduled());<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.695"></a>
+<span class="sourceLineNo">696</span>    } finally {<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      shutdownService(service1);<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      shutdownService(service2);<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    }<a name="line.699"></a>
+<span class="sourceLineNo">700</span>  }<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>  @Test<a name="line.702"></a>
+<span class="sourceLineNo">703</span>  public void testStopperForScheduledChores() throws InterruptedException {<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    ChoreService service = new ChoreService("testStopperForScheduledChores");<a name="line.704"></a>
+<span class="sourceLineNo">705</span>    Stoppable stopperForGroup1 = new SampleStopper();<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    Stoppable stopperForGroup2 = new SampleStopper();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    final int period = 100;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    final int delta = period/10;<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>    try {<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      ScheduledChore chore1_group1 = new DoNothingChore("c1g1", stopperForGroup1, period);<a name="line.711"></a>
+<span class="sourceLineNo">712</span>      ScheduledChore chore2_group1 = new DoNothingChore("c2g1", stopperForGroup1, period);<a name="line.712"></a>
+<span class="sourceLineNo">713</span>      ScheduledChore chore3_group1 = new DoNothingChore("c3g1", stopperForGroup1, period);<a name="line.713"></a>
+<span class="sourceLineNo">714</span><a name="line.714"></a>
+<span class="sourceLineNo">715</span>      ScheduledChore chore1_group2 = new DoNothingChore("c1g2", stopperForGroup2, period);<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      ScheduledChore chore2_group2 = new DoNothingChore("c2g2", stopperForGroup2, period);<a name="line.716"></a>
+<span class="sourceLineNo">717</span>      ScheduledChore chore3_group2 = new DoNothingChore("c3g2", stopperForGroup2, period);<a name="line.717"></a>
+<span class="sourceLineNo">718</span><a name="line.718"></a>
+<span class="sourceLineNo">719</span>      service.scheduleChore(chore1_group1);<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      service.scheduleChore(chore2_group1);<a name="line.720"></a>
+<span class="sourceLineNo">721</span>      service.scheduleChore(chore3_group1);<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      service.scheduleChore(chore1_group2);<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      service.scheduleChore(chore2_group2);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      service.scheduleChore(chore3_group2);<a name="line.724"></a>
+<span class="sourceLineNo">725</span><a name="line.725"></a>
+<span class="sourceLineNo">726</span>      Thread.sleep(delta);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      Thread.sleep(10 * period);<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      assertTrue(chore1_group1.isScheduled());<a name="line.728"></a>
+<span class="sourceLineNo">729</span>      assertTrue(chore2_group1.isScheduled());<a name="line.729"></a>
+<span class="sourceLineNo">730</span>      assertTrue(chore3_group1.isScheduled());<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      assertTrue(chore1_group2.isScheduled());<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      assertTrue(chore2_group2.isScheduled());<a name="line.732"></a>
+<span class="sourceLineNo">733</span>      assertTrue(chore3_group2.isScheduled());<a name="line.733"></a>
+<span class="sourceLineNo">734</span><a name="line.734"></a>
+<span class="sourceLineNo">735</span>      stopperForGroup1.stop("test stopping group 1");<a name="line.735"></a>
+<span class="sourceLineNo">736</span>      Thread.sleep(period);<a name="line.736"></a>
+<span class="sourceLineNo">737</span>      assertFalse(chore1_group1.isScheduled());<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      assertFalse(chore2_group1.isScheduled());<a name="line.738"></a>
+<span class="sourceLineNo">739</span>      assertFalse(chore3_group1.isScheduled());<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      assertTrue(chore1_group2.isScheduled());<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      assertTrue(chore2_group2.isScheduled());<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      assertTrue(chore3_group2.isScheduled());<a name="line.742"></a>
+<span class="sourceLineNo">743</span><a name="line.743"></a>
+<span class="sourceLineNo">744</span>      stopperForGroup2.stop("test stopping group 2");<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      Thread.sleep(period);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      assertFalse(chore1_group1.isScheduled());<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      assertFalse(chore2_group1.isScheduled());<a name="line.747"></a>
+<span class="sourceLineNo">748</span>      assertFalse(chore3_group1.isScheduled());<a name="line.748"></a>
+<span class="sourceLineNo">749</span>      assertFalse(chore1_group2.isScheduled());<a name="line.749"></a>
+<span class="sourceLineNo">750</span>      assertFalse(chore2_group2.isScheduled());<a name="line.750"></a>
+<span class="sourceLineNo">751</span>      assertFalse(chore3_group2.isScheduled());<a name="line.751"></a>
+<span class="sourceLineNo">752</span>    } finally {<a name="line.752"></a>
+<span class="sourceLineNo">753</span>      shutdownService(service);<a name="line.753"></a>
+<span class="sourceLineNo">754</span>    }<a name="line.754"></a>
+<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>  @Test<a name="line.757"></a>
+<span class="sourceLineNo">758</span>  public void testShutdownCancelsScheduledChores() throws InterruptedException {<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    final int period = 100;<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    ChoreService service = new ChoreService("testShutdownCancelsScheduledChores");<a name="line.760"></a>
+<span class="sourceLineNo">761</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.761"></a>
+<span class="sourceLineNo">762</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.762"></a>
+<span class="sourceLineNo">763</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.763"></a>
+<span class="sourceLineNo">764</span><a name="line.764"></a>
+<span class="sourceLineNo">765</span>    try {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      assertTrue(successChore1.isScheduled());<a name="line.767"></a>
+<span class="sourceLineNo">768</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.768"></a>
+<span class="sourceLineNo">769</span>      assertTrue(successChore2.isScheduled());<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.770"></a>
+<span class="sourceLineNo">771</span>      assertTrue(successChore3.isScheduled());<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    } finally {<a name="line.772"></a>
+<span class="sourceLineNo">773</span>      shutdownService(service);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>    assertFalse(successChore1.isScheduled());<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    assertFalse(successChore2.isScheduled());<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    assertFalse(successChore3.isScheduled());<a name="line.778"></a>
+<span class="sourceLineNo">779</span>  }<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>  @Test<a name="line.781"></a>
+<span class="sourceLineNo">782</span>  public void testShutdownWorksWhileChoresAreExecuting() throws InterruptedException {<a name="line.782"></a>
+<span class="sourceLineNo">783</span>    final int period = 100;<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    final int sleep = 5 * period;<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    ChoreService service = new ChoreService("testShutdownWorksWhileChoresAreExecuting");<a name="line.785"></a>
+<span class="sourceLineNo">786</span>    ScheduledChore slowChore1 = new SleepingChore("sc1", period, sleep);<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    ScheduledChore slowChore2 = new SleepingChore("sc2", period, sleep);<a name="line.787"></a>
+<span class="sourceLineNo">788</span>    ScheduledChore slowChore3 = new SleepingChore("sc3", period, sleep);<a name="line.788"></a>
+<span class="sourceLineNo">789</span>    try {<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      assertTrue(service.scheduleChore(slowChore1));<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      assertTrue(service.scheduleChore(slowChore2));<a name="line.791"></a>
+<span class="sourceLineNo">792</span>      assertTrue(service.scheduleChore(slowChore3));<a name="line.792"></a>
+<span class="sourceLineNo">793</span><a name="line.793"></a>
+<span class="sourceLineNo">794</span>      Thread.sleep(sleep / 2);<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      shutdownService(service);<a name="line.795"></a>
+<span class="sourceLineNo">796</span><a name="line.796"></a>
+<span class="sourceLineNo">797</span>      assertFalse(slowChore1.isScheduled());<a name="line.797"></a>
+<span class="sourceLineNo">798</span>      assertFalse(slowChore2.isScheduled());<a name="line.798"></a>
+<span class="sourceLineNo">799</span>      assertFalse(slowChore3.isScheduled());<a name="line.799"></a>
+<span class="sourceLineNo">800</span>      assertTrue(service.isShutdown());<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>      Thread.sleep(5);<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      assertTrue(service.isTerminated());<a name="line.803"></a>
+<span class="sourceLineNo">804</span>    } finally {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>      shutdownService(service);<a name="line.805"></a>
+<span class="sourceLineNo">806</span>    }<a name="line.806"></a>
+<span class="sourceLineNo">807</span>  }<a name="line.807"></a>
+<span class="sourceLineNo">808</span><a name="line.808"></a>
+<span class="sourceLineNo">809</span>  @Test<a name="line.809"></a>
+<span class="sourceLineNo">810</span>  public void testShutdownRejectsNewSchedules() throws InterruptedException {<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    final int period = 100;<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    ChoreService service = new ChoreService("testShutdownRejectsNewSchedules");<a name="line.812"></a>
+<span class="sourceLineNo">813</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    ScheduledChore failChore1 = new DoNothingChore("fc1", period);<a name="line.816"></a>
+<span class="sourceLineNo">817</span>    ScheduledChore failChore2 = new DoNothingChore("fc2", period);<a name="line.817"></a>
+<span class="sourceLineNo">818</span>    ScheduledChore failChore3 = new DoNothingChore("fc3", period);<a name="line.818"></a>
+<span class="sourceLineNo">819</span><a name="line.819"></a>
+<span class="sourceLineNo">820</span>    try {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      assertTrue(successChore1.isScheduled());<a name="line.822"></a>
+<span class="sourceLineNo">823</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.823"></a>
+<span class="sourceLineNo">824</span>      assertTrue(successChore2.isScheduled());<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      assertTrue(successChore3.isScheduled());<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    } finally {<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      shutdownService(service);<a name="line.828"></a>
+<span class="sourceLineNo">829</span>    }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>    assertFalse(service.scheduleChore(failChore1));<a name="line.831"></a>
+<span class="sourceLineNo">832</span>    assertFalse(failChore1.isScheduled());<a name="line.832"></a>
+<span class="sourceLineNo">833</span>    assertFalse(service.scheduleChore(failChore2));<a name="line.833"></a>
+<span class="sourceLineNo">834</span>    assertFalse(failChore2.isScheduled());<a name="line.834"></a>
+<span class="sourceLineNo">835</span>    assertFalse(service.scheduleChore(failChore3));<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    assertFalse(failChore3.isScheduled());<a name="line.836"></a>
+<span class="sourceLineNo">837</span>  }<a name="line.837"></a>
+<span class="sourceLineNo">838</span>}<a name="line.838"></a>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.SampleStopper.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.SampleStopper.html
index 139ba2f..4fa763e 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.SampleStopper.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.SampleStopper.html
@@ -362,17 +362,17 @@
 <span class="sourceLineNo">354</span>  public void testFrequencyOfChores() throws InterruptedException {<a name="line.354"></a>
 <span class="sourceLineNo">355</span>    final int period = 100;<a name="line.355"></a>
 <span class="sourceLineNo">356</span>    // Small delta that acts as time buffer (allowing chores to complete if running slowly)<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    final int delta = 5;<a name="line.357"></a>
+<span class="sourceLineNo">357</span>    final int delta = period/5;<a name="line.357"></a>
 <span class="sourceLineNo">358</span>    ChoreService service = new ChoreService("testFrequencyOfChores");<a name="line.358"></a>
 <span class="sourceLineNo">359</span>    CountingChore chore = new CountingChore("countingChore", period);<a name="line.359"></a>
 <span class="sourceLineNo">360</span>    try {<a name="line.360"></a>
 <span class="sourceLineNo">361</span>      service.scheduleChore(chore);<a name="line.361"></a>
 <span class="sourceLineNo">362</span><a name="line.362"></a>
 <span class="sourceLineNo">363</span>      Thread.sleep(10 * period + delta);<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      assertTrue(chore.getCountOfChoreCalls() == 11);<a name="line.364"></a>
+<span class="sourceLineNo">364</span>      assertEquals("10 periods have elapsed.", 11, chore.getCountOfChoreCalls());<a name="line.364"></a>
 <span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>      Thread.sleep(10 * period);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      assertTrue(chore.getCountOfChoreCalls() == 21);<a name="line.367"></a>
+<span class="sourceLineNo">366</span>      Thread.sleep(10 * period + delta);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      assertEquals("20 periods have elapsed.", 21, chore.getCountOfChoreCalls());<a name="line.367"></a>
 <span class="sourceLineNo">368</span>    } finally {<a name="line.368"></a>
 <span class="sourceLineNo">369</span>      shutdownService(service);<a name="line.369"></a>
 <span class="sourceLineNo">370</span>    }<a name="line.370"></a>
@@ -388,14 +388,14 @@
 <span class="sourceLineNo">380</span>  @Test<a name="line.380"></a>
 <span class="sourceLineNo">381</span>  public void testForceTrigger() throws InterruptedException {<a name="line.381"></a>
 <span class="sourceLineNo">382</span>    final int period = 100;<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    final int delta = 10;<a name="line.383"></a>
+<span class="sourceLineNo">383</span>    final int delta = period/10;<a name="line.383"></a>
 <span class="sourceLineNo">384</span>    ChoreService service = new ChoreService("testForceTrigger");<a name="line.384"></a>
 <span class="sourceLineNo">385</span>    final CountingChore chore = new CountingChore("countingChore", period);<a name="line.385"></a>
 <span class="sourceLineNo">386</span>    try {<a name="line.386"></a>
 <span class="sourceLineNo">387</span>      service.scheduleChore(chore);<a name="line.387"></a>
 <span class="sourceLineNo">388</span>      Thread.sleep(10 * period + delta);<a name="line.388"></a>
 <span class="sourceLineNo">389</span><a name="line.389"></a>
-<span class="sourceLineNo">390</span>      assertTrue(chore.getCountOfChoreCalls() == 11);<a name="line.390"></a>
+<span class="sourceLineNo">390</span>      assertEquals("10 periods have elapsed.", 11, chore.getCountOfChoreCalls());<a name="line.390"></a>
 <span class="sourceLineNo">391</span><a name="line.391"></a>
 <span class="sourceLineNo">392</span>      // Force five runs of the chore to occur, sleeping between triggers to ensure the<a name="line.392"></a>
 <span class="sourceLineNo">393</span>      // chore has time to run<a name="line.393"></a>
@@ -410,438 +410,440 @@
 <span class="sourceLineNo">402</span>      chore.triggerNow();<a name="line.402"></a>
 <span class="sourceLineNo">403</span>      Thread.sleep(delta);<a name="line.403"></a>
 <span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>      assertTrue("" + chore.getCountOfChoreCalls(), chore.getCountOfChoreCalls() == 16);<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>      Thread.sleep(10 * period + delta);<a name="line.407"></a>
-<span class="sourceLineNo">408</span><a name="line.408"></a>
-<span class="sourceLineNo">409</span>      // Be loosey-goosey. It used to be '26' but it was a big flakey relying on timing.<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      assertTrue("" + chore.getCountOfChoreCalls(), chore.getCountOfChoreCalls() &gt; 16);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    } finally {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      shutdownService(service);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  @Test<a name="line.416"></a>
-<span class="sourceLineNo">417</span>  public void testCorePoolIncrease() throws InterruptedException {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    final int initialCorePoolSize = 3;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    ChoreService service = new ChoreService("testCorePoolIncrease", initialCorePoolSize, false);<a name="line.419"></a>
-<span class="sourceLineNo">420</span><a name="line.420"></a>
-<span class="sourceLineNo">421</span>    try {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      assertEquals("Should have a core pool of size: " + initialCorePoolSize, initialCorePoolSize,<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        service.getCorePoolSize());<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>      final int slowChorePeriod = 100;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      SlowChore slowChore1 = new SlowChore("slowChore1", slowChorePeriod);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      SlowChore slowChore2 = new SlowChore("slowChore2", slowChorePeriod);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      SlowChore slowChore3 = new SlowChore("slowChore3", slowChorePeriod);<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>      service.scheduleChore(slowChore1);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      service.scheduleChore(slowChore2);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      service.scheduleChore(slowChore3);<a name="line.432"></a>
-<span class="sourceLineNo">433</span><a name="line.433"></a>
-<span class="sourceLineNo">434</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      assertEquals("Should not create more pools than scheduled chores", 3,<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        service.getCorePoolSize());<a name="line.436"></a>
-<span class="sourceLineNo">437</span><a name="line.437"></a>
-<span class="sourceLineNo">438</span>      SlowChore slowChore4 = new SlowChore("slowChore4", slowChorePeriod);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      service.scheduleChore(slowChore4);<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 4,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        service.getCorePoolSize());<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>      SlowChore slowChore5 = new SlowChore("slowChore5", slowChorePeriod);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      service.scheduleChore(slowChore5);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 5,<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        service.getCorePoolSize());<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    } finally {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      shutdownService(service);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>  @Test<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  public void testCorePoolDecrease() throws InterruptedException {<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    final int initialCorePoolSize = 3;<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    ChoreService service = new ChoreService("testCorePoolDecrease", initialCorePoolSize, false);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    final int chorePeriod = 100;<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    try {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      // Slow chores always miss their start time and thus the core pool size should be at least as<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      // large as the number of running slow chores<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      SlowChore slowChore1 = new SlowChore("slowChore1", chorePeriod);<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      SlowChore slowChore2 = new SlowChore("slowChore2", chorePeriod);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      SlowChore slowChore3 = new SlowChore("slowChore3", chorePeriod);<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>      service.scheduleChore(slowChore1);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      service.scheduleChore(slowChore2);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      service.scheduleChore(slowChore3);<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>      Thread.sleep(chorePeriod * 10);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      assertEquals("Should not create more pools than scheduled chores",<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.474"></a>
-<span class="sourceLineNo">475</span><a name="line.475"></a>
-<span class="sourceLineNo">476</span>      SlowChore slowChore4 = new SlowChore("slowChore4", chorePeriod);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      service.scheduleChore(slowChore4);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      Thread.sleep(chorePeriod * 10);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>      SlowChore slowChore5 = new SlowChore("slowChore5", chorePeriod);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      service.scheduleChore(slowChore5);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      Thread.sleep(chorePeriod * 10);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.485"></a>
-<span class="sourceLineNo">486</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.487"></a>
-<span class="sourceLineNo">488</span><a name="line.488"></a>
-<span class="sourceLineNo">489</span>      // Now we begin to cancel the chores that caused an increase in the core thread pool of the<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      // ChoreService. These cancellations should cause a decrease in the core thread pool.<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      slowChore5.cancel();<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      Thread.sleep(chorePeriod * 10);<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        service.getCorePoolSize());<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>      slowChore4.cancel();<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      Thread.sleep(chorePeriod * 10);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        service.getCorePoolSize());<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      assertEquals(3, service.getNumberOfChoresMissingStartTime());<a name="line.501"></a>
-<span class="sourceLineNo">502</span><a name="line.502"></a>
-<span class="sourceLineNo">503</span>      slowChore3.cancel();<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      Thread.sleep(chorePeriod * 10);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.505"></a>
-<span class="sourceLineNo">506</span>        service.getCorePoolSize());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      assertEquals(2, service.getNumberOfChoresMissingStartTime());<a name="line.507"></a>
-<span class="sourceLineNo">508</span><a name="line.508"></a>
-<span class="sourceLineNo">509</span>      slowChore2.cancel();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      Thread.sleep(chorePeriod * 10);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.511"></a>
-<span class="sourceLineNo">512</span>        service.getCorePoolSize());<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>      slowChore1.cancel();<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      Thread.sleep(chorePeriod * 10);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.517"></a>
-<span class="sourceLineNo">518</span>        service.getCorePoolSize());<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    } finally {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      shutdownService(service);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>  }<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>  @Test<a name="line.525"></a>
-<span class="sourceLineNo">526</span>  public void testNumberOfRunningChores() throws InterruptedException {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    ChoreService service = new ChoreService("testNumberOfRunningChores");<a name="line.527"></a>
-<span class="sourceLineNo">528</span><a name="line.528"></a>
-<span class="sourceLineNo">529</span>    final int period = 100;<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    final int sleepTime = 5;<a name="line.530"></a>
-<span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>    try {<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      DoNothingChore dn1 = new DoNothingChore("dn1", period);<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      DoNothingChore dn2 = new DoNothingChore("dn2", period);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      DoNothingChore dn3 = new DoNothingChore("dn3", period);<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      DoNothingChore dn4 = new DoNothingChore("dn4", period);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      DoNothingChore dn5 = new DoNothingChore("dn5", period);<a name="line.537"></a>
-<span class="sourceLineNo">538</span><a name="line.538"></a>
-<span class="sourceLineNo">539</span>      service.scheduleChore(dn1);<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      service.scheduleChore(dn2);<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      service.scheduleChore(dn3);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      service.scheduleChore(dn4);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      service.scheduleChore(dn5);<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>      Thread.sleep(sleepTime);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      assertEquals("Scheduled chore mismatch", 5, service.getNumberOfScheduledChores());<a name="line.546"></a>
-<span class="sourceLineNo">547</span><a name="line.547"></a>
-<span class="sourceLineNo">548</span>      dn1.cancel();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      Thread.sleep(sleepTime);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      assertEquals("Scheduled chore mismatch", 4, service.getNumberOfScheduledChores());<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>      dn2.cancel();<a name="line.552"></a>
-<span class="sourceLineNo">553</span>      dn3.cancel();<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      dn4.cancel();<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      Thread.sleep(sleepTime);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      assertEquals("Scheduled chore mismatch", 1, service.getNumberOfScheduledChores());<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>      dn5.cancel();<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      Thread.sleep(sleepTime);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      assertEquals("Scheduled chore mismatch", 0, service.getNumberOfScheduledChores());<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    } finally {<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      shutdownService(service);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    }<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  }<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>  @Test<a name="line.566"></a>
-<span class="sourceLineNo">567</span>  public void testNumberOfChoresMissingStartTime() throws InterruptedException {<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    ChoreService service = new ChoreService("testNumberOfChoresMissingStartTime");<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>    final int period = 100;<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    final int sleepTime = 5 * period;<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    try {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      // ALWAYS miss their start time since their execution takes longer than their period<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.580"></a>
-<span class="sourceLineNo">581</span><a name="line.581"></a>
-<span class="sourceLineNo">582</span>      service.scheduleChore(sc1);<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      service.scheduleChore(sc2);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      service.scheduleChore(sc3);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      service.scheduleChore(sc4);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      service.scheduleChore(sc5);<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>      Thread.sleep(sleepTime);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.589"></a>
-<span class="sourceLineNo">590</span><a name="line.590"></a>
-<span class="sourceLineNo">591</span>      sc1.cancel();<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      Thread.sleep(sleepTime);<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.593"></a>
-<span class="sourceLineNo">594</span><a name="line.594"></a>
-<span class="sourceLineNo">595</span>      sc2.cancel();<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      sc3.cancel();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      sc4.cancel();<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      Thread.sleep(sleepTime);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>      sc5.cancel();<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      Thread.sleep(sleepTime);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    } finally {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      shutdownService(service);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  }<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>  /**<a name="line.609"></a>
-<span class="sourceLineNo">610</span>   * ChoreServices should never have a core pool size that exceeds the number of chores that have<a name="line.610"></a>
-<span class="sourceLineNo">611</span>   * been scheduled with the service. For example, if 4 ScheduledChores are scheduled with a<a name="line.611"></a>
-<span class="sourceLineNo">612</span>   * ChoreService, the number of threads in the ChoreService's core pool should never exceed 4<a name="line.612"></a>
-<span class="sourceLineNo">613</span>   */<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  @Test<a name="line.614"></a>
-<span class="sourceLineNo">615</span>  public void testMaximumChoreServiceThreads() throws InterruptedException {<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    ChoreService service = new ChoreService("testMaximumChoreServiceThreads");<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>    final int period = 100;<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    final int sleepTime = 5 * period;<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>    try {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.622"></a>
-<span class="sourceLineNo">623</span>      // ALWAYS miss their start time since their execution takes longer than their period.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      // Chores that miss their start time will trigger the onChoreMissedStartTime callback<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      // in the ChoreService. This callback will try to increase the number of core pool<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      // threads.<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.628"></a>
-<span class="sourceLineNo">629</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.631"></a>
-<span class="sourceLineNo">632</span><a name="line.632"></a>
-<span class="sourceLineNo">633</span>      service.scheduleChore(sc1);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      service.scheduleChore(sc2);<a name="line.634"></a>
-<span class="sourceLineNo">635</span>      service.scheduleChore(sc3);<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      service.scheduleChore(sc4);<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      service.scheduleChore(sc5);<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>      Thread.sleep(sleepTime);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>      SlowChore sc6 = new SlowChore("sc6", period);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      SlowChore sc7 = new SlowChore("sc7", period);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      SlowChore sc8 = new SlowChore("sc8", period);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      SlowChore sc9 = new SlowChore("sc9", period);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      SlowChore sc10 = new SlowChore("sc10", period);<a name="line.646"></a>
-<span class="sourceLineNo">647</span><a name="line.647"></a>
-<span class="sourceLineNo">648</span>      service.scheduleChore(sc6);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      service.scheduleChore(sc7);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      service.scheduleChore(sc8);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      service.scheduleChore(sc9);<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      service.scheduleChore(sc10);<a name="line.652"></a>
-<span class="sourceLineNo">653</span><a name="line.653"></a>
-<span class="sourceLineNo">654</span>      Thread.sleep(sleepTime);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    } finally {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      shutdownService(service);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    }<a name="line.658"></a>
-<span class="sourceLineNo">659</span>  }<a name="line.659"></a>
-<span class="sourceLineNo">660</span><a name="line.660"></a>
-<span class="sourceLineNo">661</span>  @Test<a name="line.661"></a>
-<span class="sourceLineNo">662</span>  public void testChangingChoreServices() throws InterruptedException {<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    final int period = 100;<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    final int sleepTime = 10;<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    ChoreService service1 = new ChoreService("testChangingChoreServices_1");<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    ChoreService service2 = new ChoreService("testChangingChoreServices_2");<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    ScheduledChore chore = new DoNothingChore("sample", period);<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    try {<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      assertFalse(chore.isScheduled());<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.673"></a>
-<span class="sourceLineNo">674</span><a name="line.674"></a>
-<span class="sourceLineNo">675</span>      service1.scheduleChore(chore);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      Thread.sleep(sleepTime);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      assertTrue(chore.isScheduled());<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      assertTrue(service1.isChoreScheduled(chore));<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>      service2.scheduleChore(chore);<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      Thread.sleep(sleepTime);<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      assertTrue(chore.isScheduled());<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      assertTrue(service2.isChoreScheduled(chore));<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.687"></a>
-<span class="sourceLineNo">688</span><a name="line.688"></a>
-<span class="sourceLineNo">689</span>      chore.cancel();<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      assertFalse(chore.isScheduled());<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    } finally {<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      shutdownService(service1);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      shutdownService(service2);<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span>  }<a name="line.698"></a>
-<span class="sourceLineNo">699</span><a name="line.699"></a>
-<span class="sourceLineNo">700</span>  @Test<a name="line.700"></a>
-<span class="sourceLineNo">701</span>  public void testStopperForScheduledChores() throws InterruptedException {<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    ChoreService service = new ChoreService("testStopperForScheduledChores");<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    Stoppable stopperForGroup1 = new SampleStopper();<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    Stoppable stopperForGroup2 = new SampleStopper();<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    final int period = 100;<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    final int delta = 10;<a name="line.706"></a>
-<span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    try {<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      ScheduledChore chore1_group1 = new DoNothingChore("c1g1", stopperForGroup1, period);<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      ScheduledChore chore2_group1 = new DoNothingChore("c2g1", stopperForGroup1, period);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      ScheduledChore chore3_group1 = new DoNothingChore("c3g1", stopperForGroup1, period);<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      ScheduledChore chore1_group2 = new DoNothingChore("c1g2", stopperForGroup2, period);<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      ScheduledChore chore2_group2 = new DoNothingChore("c2g2", stopperForGroup2, period);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      ScheduledChore chore3_group2 = new DoNothingChore("c3g2", stopperForGroup2, period);<a name="line.715"></a>
-<span class="sourceLineNo">716</span><a name="line.716"></a>
-<span class="sourceLineNo">717</span>      service.scheduleChore(chore1_group1);<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      service.scheduleChore(chore2_group1);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      service.scheduleChore(chore3_group1);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      service.scheduleChore(chore1_group2);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      service.scheduleChore(chore2_group2);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      service.scheduleChore(chore3_group2);<a name="line.722"></a>
-<span class="sourceLineNo">723</span><a name="line.723"></a>
-<span class="sourceLineNo">724</span>      Thread.sleep(delta);<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      Thread.sleep(10 * period);<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      assertTrue(chore1_group1.isScheduled());<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      assertTrue(chore2_group1.isScheduled());<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      assertTrue(chore3_group1.isScheduled());<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      assertTrue(chore1_group2.isScheduled());<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      assertTrue(chore2_group2.isScheduled());<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      assertTrue(chore3_group2.isScheduled());<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>      stopperForGroup1.stop("test stopping group 1");<a name="line.733"></a>
-<span class="sourceLineNo">734</span>      Thread.sleep(period);<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      assertFalse(chore1_group1.isScheduled());<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      assertFalse(chore2_group1.isScheduled());<a name="line.736"></a>
-<span class="sourceLineNo">737</span>      assertFalse(chore3_group1.isScheduled());<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      assertTrue(chore1_group2.isScheduled());<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      assertTrue(chore2_group2.isScheduled());<a name="line.739"></a>
-<span class="sourceLineNo">740</span>      assertTrue(chore3_group2.isScheduled());<a name="line.740"></a>
-<span class="sourceLineNo">741</span><a name="line.741"></a>
-<span class="sourceLineNo">742</span>      stopperForGroup2.stop("test stopping group 2");<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      Thread.sleep(period);<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      assertFalse(chore1_group1.isScheduled());<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      assertFalse(chore2_group1.isScheduled());<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      assertFalse(chore3_group1.isScheduled());<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      assertFalse(chore1_group2.isScheduled());<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      assertFalse(chore2_group2.isScheduled());<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      assertFalse(chore3_group2.isScheduled());<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    } finally {<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      shutdownService(service);<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    }<a name="line.752"></a>
-<span class="sourceLineNo">753</span>  }<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>  @Test<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public void testShutdownCancelsScheduledChores() throws InterruptedException {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>    final int period = 100;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    ChoreService service = new ChoreService("testShutdownCancelsScheduledChores");<a name="line.758"></a>
-<span class="sourceLineNo">759</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.761"></a>
-<span class="sourceLineNo">762</span><a name="line.762"></a>
-<span class="sourceLineNo">763</span>    try {<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      assertTrue(successChore1.isScheduled());<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.766"></a>
-<span class="sourceLineNo">767</span>      assertTrue(successChore2.isScheduled());<a name="line.767"></a>
-<span class="sourceLineNo">768</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      assertTrue(successChore3.isScheduled());<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    } finally {<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      shutdownService(service);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    }<a name="line.772"></a>
-<span class="sourceLineNo">773</span><a name="line.773"></a>
-<span class="sourceLineNo">774</span>    assertFalse(successChore1.isScheduled());<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    assertFalse(successChore2.isScheduled());<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    assertFalse(successChore3.isScheduled());<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  @Test<a name="line.779"></a>
-<span class="sourceLineNo">780</span>  public void testShutdownWorksWhileChoresAreExecuting() throws InterruptedException {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    final int period = 100;<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    final int sleep = 5 * period;<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    ChoreService service = new ChoreService("testShutdownWorksWhileChoresAreExecuting");<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    ScheduledChore slowChore1 = new SleepingChore("sc1", period, sleep);<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    ScheduledChore slowChore2 = new SleepingChore("sc2", period, sleep);<a name="line.785"></a>
-<span class="sourceLineNo">786</span>    ScheduledChore slowChore3 = new SleepingChore("sc3", period, sleep);<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    try {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      assertTrue(service.scheduleChore(slowChore1));<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      assertTrue(service.scheduleChore(slowChore2));<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      assertTrue(service.scheduleChore(slowChore3));<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>      Thread.sleep(sleep / 2);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>      shutdownService(service);<a name="line.793"></a>
-<span class="sourceLineNo">794</span><a name="line.794"></a>
-<span class="sourceLineNo">795</span>      assertFalse(slowChore1.isScheduled());<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      assertFalse(slowChore2.isScheduled());<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      assertFalse(slowChore3.isScheduled());<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      assertTrue(service.isShutdown());<a name="line.798"></a>
-<span class="sourceLineNo">799</span><a name="line.799"></a>
-<span class="sourceLineNo">800</span>      Thread.sleep(5);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      assertTrue(service.isTerminated());<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    } finally {<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      shutdownService(service);<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    }<a name="line.804"></a>
-<span class="sourceLineNo">805</span>  }<a name="line.805"></a>
-<span class="sourceLineNo">806</span><a name="line.806"></a>
-<span class="sourceLineNo">807</span>  @Test<a name="line.807"></a>
-<span class="sourceLineNo">808</span>  public void testShutdownRejectsNewSchedules() throws InterruptedException {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    final int period = 100;<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    ChoreService service = new ChoreService("testShutdownRejectsNewSchedules");<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    ScheduledChore failChore1 = new DoNothingChore("fc1", period);<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    ScheduledChore failChore2 = new DoNothingChore("fc2", period);<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    ScheduledChore failChore3 = new DoNothingChore("fc3", period);<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>    try {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.819"></a>
-<span class="sourceLineNo">820</span>      assertTrue(successChore1.isScheduled());<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      assertTrue(successChore2.isScheduled());<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      assertTrue(successChore3.isScheduled());<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    } finally {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      shutdownService(service);<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>    assertFalse(service.scheduleChore(failChore1));<a name="line.829"></a>
-<span class="sourceLineNo">830</span>    assertFalse(failChore1.isScheduled());<a name="line.830"></a>
-<span class="sourceLineNo">831</span>    assertFalse(service.scheduleChore(failChore2));<a name="line.831"></a>
-<span class="sourceLineNo">832</span>    assertFalse(failChore2.isScheduled());<a name="line.832"></a>
-<span class="sourceLineNo">833</span>    assertFalse(service.scheduleChore(failChore3));<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    assertFalse(failChore3.isScheduled());<a name="line.834"></a>
-<span class="sourceLineNo">835</span>  }<a name="line.835"></a>
-<span class="sourceLineNo">836</span>}<a name="line.836"></a>
+<span class="sourceLineNo">405</span>      assertEquals("Trigger was called 5 times after 10 periods.", 16,<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          chore.getCountOfChoreCalls());<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>      Thread.sleep(10 * period + delta);<a name="line.408"></a>
+<span class="sourceLineNo">409</span><a name="line.409"></a>
+<span class="sourceLineNo">410</span>      // Be loosey-goosey. It used to be '26' but it was a big flakey relying on timing.<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      assertTrue("Expected at least 16 invocations, instead got " + chore.getCountOfChoreCalls(),<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          chore.getCountOfChoreCalls() &gt; 16);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    } finally {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      shutdownService(service);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    }<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  }<a name="line.416"></a>
+<span class="sourceLineNo">417</span><a name="line.417"></a>
+<span class="sourceLineNo">418</span>  @Test<a name="line.418"></a>
+<span class="sourceLineNo">419</span>  public void testCorePoolIncrease() throws InterruptedException {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    final int initialCorePoolSize = 3;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    ChoreService service = new ChoreService("testCorePoolIncrease", initialCorePoolSize, false);<a name="line.421"></a>
+<span class="sourceLineNo">422</span><a name="line.422"></a>
+<span class="sourceLineNo">423</span>    try {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>      assertEquals("Setting core pool size gave unexpected results.", initialCorePoolSize,<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        service.getCorePoolSize());<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>      final int slowChorePeriod = 100;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      SlowChore slowChore1 = new SlowChore("slowChore1", slowChorePeriod);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      SlowChore slowChore2 = new SlowChore("slowChore2", slowChorePeriod);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>      SlowChore slowChore3 = new SlowChore("slowChore3", slowChorePeriod);<a name="line.430"></a>
+<span class="sourceLineNo">431</span><a name="line.431"></a>
+<span class="sourceLineNo">432</span>      service.scheduleChore(slowChore1);<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      service.scheduleChore(slowChore2);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      service.scheduleChore(slowChore3);<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      assertEquals("Should not create more pools than scheduled chores", 3,<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        service.getCorePoolSize());<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>      SlowChore slowChore4 = new SlowChore("slowChore4", slowChorePeriod);<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      service.scheduleChore(slowChore4);<a name="line.441"></a>
+<span class="sourceLineNo">442</span><a name="line.442"></a>
+<span class="sourceLineNo">443</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 4,<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        service.getCorePoolSize());<a name="line.445"></a>
+<span class="sourceLineNo">446</span><a name="line.446"></a>
+<span class="sourceLineNo">447</span>      SlowChore slowChore5 = new SlowChore("slowChore5", slowChorePeriod);<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      service.scheduleChore(slowChore5);<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 5,<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        service.getCorePoolSize());<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    } finally {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      shutdownService(service);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
+<span class="sourceLineNo">457</span><a name="line.457"></a>
+<span class="sourceLineNo">458</span>  @Test<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  public void testCorePoolDecrease() throws InterruptedException {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    final int initialCorePoolSize = 3;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    ChoreService service = new ChoreService("testCorePoolDecrease", initialCorePoolSize, false);<a name="line.461"></a>
+<span class="sourceLineNo">462</span>    final int chorePeriod = 100;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    try {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>      // Slow chores always miss their start time and thus the core pool size should be at least as<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      // large as the number of running slow chores<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      SlowChore slowChore1 = new SlowChore("slowChore1", chorePeriod);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      SlowChore slowChore2 = new SlowChore("slowChore2", chorePeriod);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      SlowChore slowChore3 = new SlowChore("slowChore3", chorePeriod);<a name="line.468"></a>
+<span class="sourceLineNo">469</span><a name="line.469"></a>
+<span class="sourceLineNo">470</span>      service.scheduleChore(slowChore1);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      service.scheduleChore(slowChore2);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>      service.scheduleChore(slowChore3);<a name="line.472"></a>
+<span class="sourceLineNo">473</span><a name="line.473"></a>
+<span class="sourceLineNo">474</span>      Thread.sleep(chorePeriod * 10);<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      assertEquals("Should not create more pools than scheduled chores",<a name="line.475"></a>
+<span class="sourceLineNo">476</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>      SlowChore slowChore4 = new SlowChore("slowChore4", chorePeriod);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      service.scheduleChore(slowChore4);<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      Thread.sleep(chorePeriod * 10);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.481"></a>
+<span class="sourceLineNo">482</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>      SlowChore slowChore5 = new SlowChore("slowChore5", chorePeriod);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      service.scheduleChore(slowChore5);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      Thread.sleep(chorePeriod * 10);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.487"></a>
+<span class="sourceLineNo">488</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>      // Now we begin to cancel the chores that caused an increase in the core thread pool of the<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      // ChoreService. These cancellations should cause a decrease in the core thread pool.<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      slowChore5.cancel();<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      Thread.sleep(chorePeriod * 10);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.495"></a>
+<span class="sourceLineNo">496</span>        service.getCorePoolSize());<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.497"></a>
+<span class="sourceLineNo">498</span><a name="line.498"></a>
+<span class="sourceLineNo">499</span>      slowChore4.cancel();<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      Thread.sleep(chorePeriod * 10);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        service.getCorePoolSize());<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      assertEquals(3, service.getNumberOfChoresMissingStartTime());<a name="line.503"></a>
+<span class="sourceLineNo">504</span><a name="line.504"></a>
+<span class="sourceLineNo">505</span>      slowChore3.cancel();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      Thread.sleep(chorePeriod * 10);<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        service.getCorePoolSize());<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      assertEquals(2, service.getNumberOfChoresMissingStartTime());<a name="line.509"></a>
+<span class="sourceLineNo">510</span><a name="line.510"></a>
+<span class="sourceLineNo">511</span>      slowChore2.cancel();<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      Thread.sleep(chorePeriod * 10);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.513"></a>
+<span class="sourceLineNo">514</span>        service.getCorePoolSize());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.515"></a>
+<span class="sourceLineNo">516</span><a name="line.516"></a>
+<span class="sourceLineNo">517</span>      slowChore1.cancel();<a name="line.517"></a>
+<span class="sourceLineNo">518</span>      Thread.sleep(chorePeriod * 10);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.519"></a>
+<span class="sourceLineNo">520</span>        service.getCorePoolSize());<a name="line.520"></a>
+<span class="sourceLineNo">521</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    } finally {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      shutdownService(service);<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
+<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>  @Test<a name="line.527"></a>
+<span class="sourceLineNo">528</span>  public void testNumberOfRunningChores() throws InterruptedException {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    ChoreService service = new ChoreService("testNumberOfRunningChores");<a name="line.529"></a>
+<span class="sourceLineNo">530</span><a name="line.530"></a>
+<span class="sourceLineNo">531</span>    final int period = 100;<a name="line.531"></a>
+<span class="sourceLineNo">532</span>    final int sleepTime = 5;<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>    try {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      DoNothingChore dn1 = new DoNothingChore("dn1", period);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      DoNothingChore dn2 = new DoNothingChore("dn2", period);<a name="line.536"></a>
+<span class="sourceLineNo">537</span>      DoNothingChore dn3 = new DoNothingChore("dn3", period);<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      DoNothingChore dn4 = new DoNothingChore("dn4", period);<a name="line.538"></a>
+<span class="sourceLineNo">539</span>      DoNothingChore dn5 = new DoNothingChore("dn5", period);<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>      service.scheduleChore(dn1);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      service.scheduleChore(dn2);<a name="line.542"></a>
+<span class="sourceLineNo">543</span>      service.scheduleChore(dn3);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>      service.scheduleChore(dn4);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      service.scheduleChore(dn5);<a name="line.545"></a>
+<span class="sourceLineNo">546</span><a name="line.546"></a>
+<span class="sourceLineNo">547</span>      Thread.sleep(sleepTime);<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      assertEquals("Scheduled chore mismatch", 5, service.getNumberOfScheduledChores());<a name="line.548"></a>
+<span class="sourceLineNo">549</span><a name="line.549"></a>
+<span class="sourceLineNo">550</span>      dn1.cancel();<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      Thread.sleep(sleepTime);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      assertEquals("Scheduled chore mismatch", 4, service.getNumberOfScheduledChores());<a name="line.552"></a>
+<span class="sourceLineNo">553</span><a name="line.553"></a>
+<span class="sourceLineNo">554</span>      dn2.cancel();<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      dn3.cancel();<a name="line.555"></a>
+<span class="sourceLineNo">556</span>      dn4.cancel();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>      Thread.sleep(sleepTime);<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      assertEquals("Scheduled chore mismatch", 1, service.getNumberOfScheduledChores());<a name="line.558"></a>
+<span class="sourceLineNo">559</span><a name="line.559"></a>
+<span class="sourceLineNo">560</span>      dn5.cancel();<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      Thread.sleep(sleepTime);<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      assertEquals("Scheduled chore mismatch", 0, service.getNumberOfScheduledChores());<a name="line.562"></a>
+<span class="sourceLineNo">563</span>    } finally {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      shutdownService(service);<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    }<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  @Test<a name="line.568"></a>
+<span class="sourceLineNo">569</span>  public void testNumberOfChoresMissingStartTime() throws InterruptedException {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    ChoreService service = new ChoreService("testNumberOfChoresMissingStartTime");<a name="line.570"></a>
+<span class="sourceLineNo">571</span><a name="line.571"></a>
+<span class="sourceLineNo">572</span>    final int period = 100;<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    final int sleepTime = 5 * period;<a name="line.573"></a>
+<span class="sourceLineNo">574</span><a name="line.574"></a>
+<span class="sourceLineNo">575</span>    try {<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      // ALWAYS miss their start time since their execution takes longer than their period<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.578"></a>
+<span class="sourceLineNo">579</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.581"></a>
+<span class="sourceLineNo">582</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.582"></a>
+<span class="sourceLineNo">583</span><a name="line.583"></a>
+<span class="sourceLineNo">584</span>      service.scheduleChore(sc1);<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      service.scheduleChore(sc2);<a name="line.585"></a>
+<span class="sourceLineNo">586</span>      service.scheduleChore(sc3);<a name="line.586"></a>
+<span class="sourceLineNo">587</span>      service.scheduleChore(sc4);<a name="line.587"></a>
+<span class="sourceLineNo">588</span>      service.scheduleChore(sc5);<a name="line.588"></a>
+<span class="sourceLineNo">589</span><a name="line.589"></a>
+<span class="sourceLineNo">590</span>      Thread.sleep(sleepTime);<a name="line.590"></a>
+<span class="sourceLineNo">591</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.591"></a>
+<span class="sourceLineNo">592</span><a name="line.592"></a>
+<span class="sourceLineNo">593</span>      sc1.cancel();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>      Thread.sleep(sleepTime);<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>      sc2.cancel();<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      sc3.cancel();<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      sc4.cancel();<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      Thread.sleep(sleepTime);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.601"></a>
+<span class="sourceLineNo">602</span><a name="line.602"></a>
+<span class="sourceLineNo">603</span>      sc5.cancel();<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      Thread.sleep(sleepTime);<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.605"></a>
+<span class="sourceLineNo">606</span>    } finally {<a name="line.606"></a>
+<span class="sourceLineNo">607</span>      shutdownService(service);<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
+<span class="sourceLineNo">609</span>  }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>  /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>   * ChoreServices should never have a core pool size that exceeds the number of chores that have<a name="line.612"></a>
+<span class="sourceLineNo">613</span>   * been scheduled with the service. For example, if 4 ScheduledChores are scheduled with a<a name="line.613"></a>
+<span class="sourceLineNo">614</span>   * ChoreService, the number of threads in the ChoreService's core pool should never exceed 4<a name="line.614"></a>
+<span class="sourceLineNo">615</span>   */<a name="line.615"></a>
+<span class="sourceLineNo">616</span>  @Test<a name="line.616"></a>
+<span class="sourceLineNo">617</span>  public void testMaximumChoreServiceThreads() throws InterruptedException {<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    ChoreService service = new ChoreService("testMaximumChoreServiceThreads");<a name="line.618"></a>
+<span class="sourceLineNo">619</span><a name="line.619"></a>
+<span class="sourceLineNo">620</span>    final int period = 100;<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    final int sleepTime = 5 * period;<a name="line.621"></a>
+<span class="sourceLineNo">622</span><a name="line.622"></a>
+<span class="sourceLineNo">623</span>    try {<a name="line.623"></a>
+<span class="sourceLineNo">624</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      // ALWAYS miss their start time since their execution takes longer than their period.<a name="line.625"></a>
+<span class="sourceLineNo">626</span>      // Chores that miss their start time will trigger the onChoreMissedStartTime callback<a name="line.626"></a>
+<span class="sourceLineNo">627</span>      // in the ChoreService. This callback will try to increase the number of core pool<a name="line.627"></a>
+<span class="sourceLineNo">628</span>      // threads.<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.630"></a>
+<span class="sourceLineNo">631</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.631"></a>
+<span class="sourceLineNo">632</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.632"></a>
+<span class="sourceLineNo">633</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.633"></a>
+<span class="sourceLineNo">634</span><a name="line.634"></a>
+<span class="sourceLineNo">635</span>      service.scheduleChore(sc1);<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      service.scheduleChore(sc2);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      service.scheduleChore(sc3);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>      service.scheduleChore(sc4);<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      service.scheduleChore(sc5);<a name="line.639"></a>
+<span class="sourceLineNo">640</span><a name="line.640"></a>
+<span class="sourceLineNo">641</span>      Thread.sleep(sleepTime);<a name="line.641"></a>
+<span class="sourceLineNo">642</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>      SlowChore sc6 = new SlowChore("sc6", period);<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      SlowChore sc7 = new SlowChore("sc7", period);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>      SlowChore sc8 = new SlowChore("sc8", period);<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      SlowChore sc9 = new SlowChore("sc9", period);<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      SlowChore sc10 = new SlowChore("sc10", period);<a name="line.648"></a>
+<span class="sourceLineNo">649</span><a name="line.649"></a>
+<span class="sourceLineNo">650</span>      service.scheduleChore(sc6);<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      service.scheduleChore(sc7);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      service.scheduleChore(sc8);<a name="line.652"></a>
+<span class="sourceLineNo">653</span>      service.scheduleChore(sc9);<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      service.scheduleChore(sc10);<a name="line.654"></a>
+<span class="sourceLineNo">655</span><a name="line.655"></a>
+<span class="sourceLineNo">656</span>      Thread.sleep(sleepTime);<a name="line.656"></a>
+<span class="sourceLineNo">657</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    } finally {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>      shutdownService(service);<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    }<a name="line.660"></a>
+<span class="sourceLineNo">661</span>  }<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>  @Test<a name="line.663"></a>
+<span class="sourceLineNo">664</span>  public void testChangingChoreServices() throws InterruptedException {<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    final int period = 100;<a name="line.665"></a>
+<span class="sourceLineNo">666</span>    final int sleepTime = 10;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    ChoreService service1 = new ChoreService("testChangingChoreServices_1");<a name="line.667"></a>
+<span class="sourceLineNo">668</span>    ChoreService service2 = new ChoreService("testChangingChoreServices_2");<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    ScheduledChore chore = new DoNothingChore("sample", period);<a name="line.669"></a>
+<span class="sourceLineNo">670</span><a name="line.670"></a>
+<span class="sourceLineNo">671</span>    try {<a name="line.671"></a>
+<span class="sourceLineNo">672</span>      assertFalse(chore.isScheduled());<a name="line.672"></a>
+<span class="sourceLineNo">673</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>      service1.scheduleChore(chore);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>      Thread.sleep(sleepTime);<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      assertTrue(chore.isScheduled());<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      assertTrue(service1.isChoreScheduled(chore));<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.682"></a>
+<span class="sourceLineNo">683</span><a name="line.683"></a>
+<span class="sourceLineNo">684</span>      service2.scheduleChore(chore);<a name="line.684"></a>
+<span class="sourceLineNo">685</span>      Thread.sleep(sleepTime);<a name="line.685"></a>
+<span class="sourceLineNo">686</span>      assertTrue(chore.isScheduled());<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.687"></a>
+<span class="sourceLineNo">688</span>      assertTrue(service2.isChoreScheduled(chore));<a name="line.688"></a>
+<span class="sourceLineNo">689</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.689"></a>
+<span class="sourceLineNo">690</span><a name="line.690"></a>
+<span class="sourceLineNo">691</span>      chore.cancel();<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      assertFalse(chore.isScheduled());<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.695"></a>
+<span class="sourceLineNo">696</span>    } finally {<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      shutdownService(service1);<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      shutdownService(service2);<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    }<a name="line.699"></a>
+<span class="sourceLineNo">700</span>  }<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>  @Test<a name="line.702"></a>
+<span class="sourceLineNo">703</span>  public void testStopperForScheduledChores() throws InterruptedException {<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    ChoreService service = new ChoreService("testStopperForScheduledChores");<a name="line.704"></a>
+<span class="sourceLineNo">705</span>    Stoppable stopperForGroup1 = new SampleStopper();<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    Stoppable stopperForGroup2 = new SampleStopper();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    final int period = 100;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    final int delta = period/10;<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>    try {<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      ScheduledChore chore1_group1 = new DoNothingChore("c1g1", stopperForGroup1, period);<a name="line.711"></a>
+<span class="sourceLineNo">712</span>      ScheduledChore chore2_group1 = new DoNothingChore("c2g1", stopperForGroup1, period);<a name="line.712"></a>
+<span class="sourceLineNo">713</span>      ScheduledChore chore3_group1 = new DoNothingChore("c3g1", stopperForGroup1, period);<a name="line.713"></a>
+<span class="sourceLineNo">714</span><a name="line.714"></a>
+<span class="sourceLineNo">715</span>      ScheduledChore chore1_group2 = new DoNothingChore("c1g2", stopperForGroup2, period);<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      ScheduledChore chore2_group2 = new DoNothingChore("c2g2", stopperForGroup2, period);<a name="line.716"></a>
+<span class="sourceLineNo">717</span>      ScheduledChore chore3_group2 = new DoNothingChore("c3g2", stopperForGroup2, period);<a name="line.717"></a>
+<span class="sourceLineNo">718</span><a name="line.718"></a>
+<span class="sourceLineNo">719</span>      service.scheduleChore(chore1_group1);<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      service.scheduleChore(chore2_group1);<a name="line.720"></a>
+<span class="sourceLineNo">721</span>      service.scheduleChore(chore3_group1);<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      service.scheduleChore(chore1_group2);<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      service.scheduleChore(chore2_group2);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      service.scheduleChore(chore3_group2);<a name="line.724"></a>
+<span class="sourceLineNo">725</span><a name="line.725"></a>
+<span class="sourceLineNo">726</span>      Thread.sleep(delta);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      Thread.sleep(10 * period);<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      assertTrue(chore1_group1.isScheduled());<a name="line.728"></a>
+<span class="sourceLineNo">729</span>      assertTrue(chore2_group1.isScheduled());<a name="line.729"></a>
+<span class="sourceLineNo">730</span>      assertTrue(chore3_group1.isScheduled());<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      assertTrue(chore1_group2.isScheduled());<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      assertTrue(chore2_group2.isScheduled());<a name="line.732"></a>
+<span class="sourceLineNo">733</span>      assertTrue(chore3_group2.isScheduled());<a name="line.733"></a>
+<span class="sourceLineNo">734</span><a name="line.734"></a>
+<span class="sourceLineNo">735</span>      stopperForGroup1.stop("test stopping group 1");<a name="line.735"></a>
+<span class="sourceLineNo">736</span>      Thread.sleep(period);<a name="line.736"></a>
+<span class="sourceLineNo">737</span>      assertFalse(chore1_group1.isScheduled());<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      assertFalse(chore2_group1.isScheduled());<a name="line.738"></a>
+<span class="sourceLineNo">739</span>      assertFalse(chore3_group1.isScheduled());<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      assertTrue(chore1_group2.isScheduled());<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      assertTrue(chore2_group2.isScheduled());<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      assertTrue(chore3_group2.isScheduled());<a name="line.742"></a>
+<span class="sourceLineNo">743</span><a name="line.743"></a>
+<span class="sourceLineNo">744</span>      stopperForGroup2.stop("test stopping group 2");<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      Thread.sleep(period);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      assertFalse(chore1_group1.isScheduled());<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      assertFalse(chore2_group1.isScheduled());<a name="line.747"></a>
+<span class="sourceLineNo">748</span>      assertFalse(chore3_group1.isScheduled());<a name="line.748"></a>
+<span class="sourceLineNo">749</span>      assertFalse(chore1_group2.isScheduled());<a name="line.749"></a>
+<span class="sourceLineNo">750</span>      assertFalse(chore2_group2.isScheduled());<a name="line.750"></a>
+<span class="sourceLineNo">751</span>      assertFalse(chore3_group2.isScheduled());<a name="line.751"></a>
+<span class="sourceLineNo">752</span>    } finally {<a name="line.752"></a>
+<span class="sourceLineNo">753</span>      shutdownService(service);<a name="line.753"></a>
+<span class="sourceLineNo">754</span>    }<a name="line.754"></a>
+<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>  @Test<a name="line.757"></a>
+<span class="sourceLineNo">758</span>  public void testShutdownCancelsScheduledChores() throws InterruptedException {<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    final int period = 100;<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    ChoreService service = new ChoreService("testShutdownCancelsScheduledChores");<a name="line.760"></a>
+<span class="sourceLineNo">761</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.761"></a>
+<span class="sourceLineNo">762</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.762"></a>
+<span class="sourceLineNo">763</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.763"></a>
+<span class="sourceLineNo">764</span><a name="line.764"></a>
+<span class="sourceLineNo">765</span>    try {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      assertTrue(successChore1.isScheduled());<a name="line.767"></a>
+<span class="sourceLineNo">768</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.768"></a>
+<span class="sourceLineNo">769</span>      assertTrue(successChore2.isScheduled());<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.770"></a>
+<span class="sourceLineNo">771</span>      assertTrue(successChore3.isScheduled());<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    } finally {<a name="line.772"></a>
+<span class="sourceLineNo">773</span>      shutdownService(service);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>    assertFalse(successChore1.isScheduled());<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    assertFalse(successChore2.isScheduled());<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    assertFalse(successChore3.isScheduled());<a name="line.778"></a>
+<span class="sourceLineNo">779</span>  }<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>  @Test<a name="line.781"></a>
+<span class="sourceLineNo">782</span>  public void testShutdownWorksWhileChoresAreExecuting() throws InterruptedException {<a name="line.782"></a>
+<span class="sourceLineNo">783</span>    final int period = 100;<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    final int sleep = 5 * period;<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    ChoreService service = new ChoreService("testShutdownWorksWhileChoresAreExecuting");<a name="line.785"></a>
+<span class="sourceLineNo">786</span>    ScheduledChore slowChore1 = new SleepingChore("sc1", period, sleep);<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    ScheduledChore slowChore2 = new SleepingChore("sc2", period, sleep);<a name="line.787"></a>
+<span class="sourceLineNo">788</span>    ScheduledChore slowChore3 = new SleepingChore("sc3", period, sleep);<a name="line.788"></a>
+<span class="sourceLineNo">789</span>    try {<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      assertTrue(service.scheduleChore(slowChore1));<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      assertTrue(service.scheduleChore(slowChore2));<a name="line.791"></a>
+<span class="sourceLineNo">792</span>      assertTrue(service.scheduleChore(slowChore3));<a name="line.792"></a>
+<span class="sourceLineNo">793</span><a name="line.793"></a>
+<span class="sourceLineNo">794</span>      Thread.sleep(sleep / 2);<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      shutdownService(service);<a name="line.795"></a>
+<span class="sourceLineNo">796</span><a name="line.796"></a>
+<span class="sourceLineNo">797</span>      assertFalse(slowChore1.isScheduled());<a name="line.797"></a>
+<span class="sourceLineNo">798</span>      assertFalse(slowChore2.isScheduled());<a name="line.798"></a>
+<span class="sourceLineNo">799</span>      assertFalse(slowChore3.isScheduled());<a name="line.799"></a>
+<span class="sourceLineNo">800</span>      assertTrue(service.isShutdown());<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>      Thread.sleep(5);<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      assertTrue(service.isTerminated());<a name="line.803"></a>
+<span class="sourceLineNo">804</span>    } finally {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>      shutdownService(service);<a name="line.805"></a>
+<span class="sourceLineNo">806</span>    }<a name="line.806"></a>
+<span class="sourceLineNo">807</span>  }<a name="line.807"></a>
+<span class="sourceLineNo">808</span><a name="line.808"></a>
+<span class="sourceLineNo">809</span>  @Test<a name="line.809"></a>
+<span class="sourceLineNo">810</span>  public void testShutdownRejectsNewSchedules() throws InterruptedException {<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    final int period = 100;<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    ChoreService service = new ChoreService("testShutdownRejectsNewSchedules");<a name="line.812"></a>
+<span class="sourceLineNo">813</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    ScheduledChore failChore1 = new DoNothingChore("fc1", period);<a name="line.816"></a>
+<span class="sourceLineNo">817</span>    ScheduledChore failChore2 = new DoNothingChore("fc2", period);<a name="line.817"></a>
+<span class="sourceLineNo">818</span>    ScheduledChore failChore3 = new DoNothingChore("fc3", period);<a name="line.818"></a>
+<span class="sourceLineNo">819</span><a name="line.819"></a>
+<span class="sourceLineNo">820</span>    try {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      assertTrue(successChore1.isScheduled());<a name="line.822"></a>
+<span class="sourceLineNo">823</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.823"></a>
+<span class="sourceLineNo">824</span>      assertTrue(successChore2.isScheduled());<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      assertTrue(successChore3.isScheduled());<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    } finally {<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      shutdownService(service);<a name="line.828"></a>
+<span class="sourceLineNo">829</span>    }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>    assertFalse(service.scheduleChore(failChore1));<a name="line.831"></a>
+<span class="sourceLineNo">832</span>    assertFalse(failChore1.isScheduled());<a name="line.832"></a>
+<span class="sourceLineNo">833</span>    assertFalse(service.scheduleChore(failChore2));<a name="line.833"></a>
+<span class="sourceLineNo">834</span>    assertFalse(failChore2.isScheduled());<a name="line.834"></a>
+<span class="sourceLineNo">835</span>    assertFalse(service.scheduleChore(failChore3));<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    assertFalse(failChore3.isScheduled());<a name="line.836"></a>
+<span class="sourceLineNo">837</span>  }<a name="line.837"></a>
+<span class="sourceLineNo">838</span>}<a name="line.838"></a>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.SleepingChore.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.SleepingChore.html
index 139ba2f..4fa763e 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.SleepingChore.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.SleepingChore.html
@@ -362,17 +362,17 @@
 <span class="sourceLineNo">354</span>  public void testFrequencyOfChores() throws InterruptedException {<a name="line.354"></a>
 <span class="sourceLineNo">355</span>    final int period = 100;<a name="line.355"></a>
 <span class="sourceLineNo">356</span>    // Small delta that acts as time buffer (allowing chores to complete if running slowly)<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    final int delta = 5;<a name="line.357"></a>
+<span class="sourceLineNo">357</span>    final int delta = period/5;<a name="line.357"></a>
 <span class="sourceLineNo">358</span>    ChoreService service = new ChoreService("testFrequencyOfChores");<a name="line.358"></a>
 <span class="sourceLineNo">359</span>    CountingChore chore = new CountingChore("countingChore", period);<a name="line.359"></a>
 <span class="sourceLineNo">360</span>    try {<a name="line.360"></a>
 <span class="sourceLineNo">361</span>      service.scheduleChore(chore);<a name="line.361"></a>
 <span class="sourceLineNo">362</span><a name="line.362"></a>
 <span class="sourceLineNo">363</span>      Thread.sleep(10 * period + delta);<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      assertTrue(chore.getCountOfChoreCalls() == 11);<a name="line.364"></a>
+<span class="sourceLineNo">364</span>      assertEquals("10 periods have elapsed.", 11, chore.getCountOfChoreCalls());<a name="line.364"></a>
 <span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>      Thread.sleep(10 * period);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      assertTrue(chore.getCountOfChoreCalls() == 21);<a name="line.367"></a>
+<span class="sourceLineNo">366</span>      Thread.sleep(10 * period + delta);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      assertEquals("20 periods have elapsed.", 21, chore.getCountOfChoreCalls());<a name="line.367"></a>
 <span class="sourceLineNo">368</span>    } finally {<a name="line.368"></a>
 <span class="sourceLineNo">369</span>      shutdownService(service);<a name="line.369"></a>
 <span class="sourceLineNo">370</span>    }<a name="line.370"></a>
@@ -388,14 +388,14 @@
 <span class="sourceLineNo">380</span>  @Test<a name="line.380"></a>
 <span class="sourceLineNo">381</span>  public void testForceTrigger() throws InterruptedException {<a name="line.381"></a>
 <span class="sourceLineNo">382</span>    final int period = 100;<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    final int delta = 10;<a name="line.383"></a>
+<span class="sourceLineNo">383</span>    final int delta = period/10;<a name="line.383"></a>
 <span class="sourceLineNo">384</span>    ChoreService service = new ChoreService("testForceTrigger");<a name="line.384"></a>
 <span class="sourceLineNo">385</span>    final CountingChore chore = new CountingChore("countingChore", period);<a name="line.385"></a>
 <span class="sourceLineNo">386</span>    try {<a name="line.386"></a>
 <span class="sourceLineNo">387</span>      service.scheduleChore(chore);<a name="line.387"></a>
 <span class="sourceLineNo">388</span>      Thread.sleep(10 * period + delta);<a name="line.388"></a>
 <span class="sourceLineNo">389</span><a name="line.389"></a>
-<span class="sourceLineNo">390</span>      assertTrue(chore.getCountOfChoreCalls() == 11);<a name="line.390"></a>
+<span class="sourceLineNo">390</span>      assertEquals("10 periods have elapsed.", 11, chore.getCountOfChoreCalls());<a name="line.390"></a>
 <span class="sourceLineNo">391</span><a name="line.391"></a>
 <span class="sourceLineNo">392</span>      // Force five runs of the chore to occur, sleeping between triggers to ensure the<a name="line.392"></a>
 <span class="sourceLineNo">393</span>      // chore has time to run<a name="line.393"></a>
@@ -410,438 +410,440 @@
 <span class="sourceLineNo">402</span>      chore.triggerNow();<a name="line.402"></a>
 <span class="sourceLineNo">403</span>      Thread.sleep(delta);<a name="line.403"></a>
 <span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>      assertTrue("" + chore.getCountOfChoreCalls(), chore.getCountOfChoreCalls() == 16);<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>      Thread.sleep(10 * period + delta);<a name="line.407"></a>
-<span class="sourceLineNo">408</span><a name="line.408"></a>
-<span class="sourceLineNo">409</span>      // Be loosey-goosey. It used to be '26' but it was a big flakey relying on timing.<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      assertTrue("" + chore.getCountOfChoreCalls(), chore.getCountOfChoreCalls() &gt; 16);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    } finally {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      shutdownService(service);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  @Test<a name="line.416"></a>
-<span class="sourceLineNo">417</span>  public void testCorePoolIncrease() throws InterruptedException {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    final int initialCorePoolSize = 3;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    ChoreService service = new ChoreService("testCorePoolIncrease", initialCorePoolSize, false);<a name="line.419"></a>
-<span class="sourceLineNo">420</span><a name="line.420"></a>
-<span class="sourceLineNo">421</span>    try {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      assertEquals("Should have a core pool of size: " + initialCorePoolSize, initialCorePoolSize,<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        service.getCorePoolSize());<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>      final int slowChorePeriod = 100;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      SlowChore slowChore1 = new SlowChore("slowChore1", slowChorePeriod);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      SlowChore slowChore2 = new SlowChore("slowChore2", slowChorePeriod);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      SlowChore slowChore3 = new SlowChore("slowChore3", slowChorePeriod);<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>      service.scheduleChore(slowChore1);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      service.scheduleChore(slowChore2);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      service.scheduleChore(slowChore3);<a name="line.432"></a>
-<span class="sourceLineNo">433</span><a name="line.433"></a>
-<span class="sourceLineNo">434</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      assertEquals("Should not create more pools than scheduled chores", 3,<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        service.getCorePoolSize());<a name="line.436"></a>
-<span class="sourceLineNo">437</span><a name="line.437"></a>
-<span class="sourceLineNo">438</span>      SlowChore slowChore4 = new SlowChore("slowChore4", slowChorePeriod);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      service.scheduleChore(slowChore4);<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 4,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        service.getCorePoolSize());<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>      SlowChore slowChore5 = new SlowChore("slowChore5", slowChorePeriod);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      service.scheduleChore(slowChore5);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 5,<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        service.getCorePoolSize());<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    } finally {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      shutdownService(service);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>  @Test<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  public void testCorePoolDecrease() throws InterruptedException {<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    final int initialCorePoolSize = 3;<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    ChoreService service = new ChoreService("testCorePoolDecrease", initialCorePoolSize, false);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    final int chorePeriod = 100;<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    try {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      // Slow chores always miss their start time and thus the core pool size should be at least as<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      // large as the number of running slow chores<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      SlowChore slowChore1 = new SlowChore("slowChore1", chorePeriod);<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      SlowChore slowChore2 = new SlowChore("slowChore2", chorePeriod);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      SlowChore slowChore3 = new SlowChore("slowChore3", chorePeriod);<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>      service.scheduleChore(slowChore1);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      service.scheduleChore(slowChore2);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      service.scheduleChore(slowChore3);<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>      Thread.sleep(chorePeriod * 10);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      assertEquals("Should not create more pools than scheduled chores",<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.474"></a>
-<span class="sourceLineNo">475</span><a name="line.475"></a>
-<span class="sourceLineNo">476</span>      SlowChore slowChore4 = new SlowChore("slowChore4", chorePeriod);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      service.scheduleChore(slowChore4);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      Thread.sleep(chorePeriod * 10);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>      SlowChore slowChore5 = new SlowChore("slowChore5", chorePeriod);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      service.scheduleChore(slowChore5);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      Thread.sleep(chorePeriod * 10);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.485"></a>
-<span class="sourceLineNo">486</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.487"></a>
-<span class="sourceLineNo">488</span><a name="line.488"></a>
-<span class="sourceLineNo">489</span>      // Now we begin to cancel the chores that caused an increase in the core thread pool of the<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      // ChoreService. These cancellations should cause a decrease in the core thread pool.<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      slowChore5.cancel();<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      Thread.sleep(chorePeriod * 10);<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        service.getCorePoolSize());<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>      slowChore4.cancel();<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      Thread.sleep(chorePeriod * 10);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        service.getCorePoolSize());<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      assertEquals(3, service.getNumberOfChoresMissingStartTime());<a name="line.501"></a>
-<span class="sourceLineNo">502</span><a name="line.502"></a>
-<span class="sourceLineNo">503</span>      slowChore3.cancel();<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      Thread.sleep(chorePeriod * 10);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.505"></a>
-<span class="sourceLineNo">506</span>        service.getCorePoolSize());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      assertEquals(2, service.getNumberOfChoresMissingStartTime());<a name="line.507"></a>
-<span class="sourceLineNo">508</span><a name="line.508"></a>
-<span class="sourceLineNo">509</span>      slowChore2.cancel();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      Thread.sleep(chorePeriod * 10);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.511"></a>
-<span class="sourceLineNo">512</span>        service.getCorePoolSize());<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>      slowChore1.cancel();<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      Thread.sleep(chorePeriod * 10);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.517"></a>
-<span class="sourceLineNo">518</span>        service.getCorePoolSize());<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    } finally {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      shutdownService(service);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>  }<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>  @Test<a name="line.525"></a>
-<span class="sourceLineNo">526</span>  public void testNumberOfRunningChores() throws InterruptedException {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    ChoreService service = new ChoreService("testNumberOfRunningChores");<a name="line.527"></a>
-<span class="sourceLineNo">528</span><a name="line.528"></a>
-<span class="sourceLineNo">529</span>    final int period = 100;<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    final int sleepTime = 5;<a name="line.530"></a>
-<span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>    try {<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      DoNothingChore dn1 = new DoNothingChore("dn1", period);<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      DoNothingChore dn2 = new DoNothingChore("dn2", period);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      DoNothingChore dn3 = new DoNothingChore("dn3", period);<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      DoNothingChore dn4 = new DoNothingChore("dn4", period);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      DoNothingChore dn5 = new DoNothingChore("dn5", period);<a name="line.537"></a>
-<span class="sourceLineNo">538</span><a name="line.538"></a>
-<span class="sourceLineNo">539</span>      service.scheduleChore(dn1);<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      service.scheduleChore(dn2);<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      service.scheduleChore(dn3);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      service.scheduleChore(dn4);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      service.scheduleChore(dn5);<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>      Thread.sleep(sleepTime);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      assertEquals("Scheduled chore mismatch", 5, service.getNumberOfScheduledChores());<a name="line.546"></a>
-<span class="sourceLineNo">547</span><a name="line.547"></a>
-<span class="sourceLineNo">548</span>      dn1.cancel();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      Thread.sleep(sleepTime);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      assertEquals("Scheduled chore mismatch", 4, service.getNumberOfScheduledChores());<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>      dn2.cancel();<a name="line.552"></a>
-<span class="sourceLineNo">553</span>      dn3.cancel();<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      dn4.cancel();<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      Thread.sleep(sleepTime);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      assertEquals("Scheduled chore mismatch", 1, service.getNumberOfScheduledChores());<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>      dn5.cancel();<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      Thread.sleep(sleepTime);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      assertEquals("Scheduled chore mismatch", 0, service.getNumberOfScheduledChores());<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    } finally {<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      shutdownService(service);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    }<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  }<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>  @Test<a name="line.566"></a>
-<span class="sourceLineNo">567</span>  public void testNumberOfChoresMissingStartTime() throws InterruptedException {<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    ChoreService service = new ChoreService("testNumberOfChoresMissingStartTime");<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>    final int period = 100;<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    final int sleepTime = 5 * period;<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    try {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      // ALWAYS miss their start time since their execution takes longer than their period<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.580"></a>
-<span class="sourceLineNo">581</span><a name="line.581"></a>
-<span class="sourceLineNo">582</span>      service.scheduleChore(sc1);<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      service.scheduleChore(sc2);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      service.scheduleChore(sc3);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      service.scheduleChore(sc4);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      service.scheduleChore(sc5);<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>      Thread.sleep(sleepTime);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.589"></a>
-<span class="sourceLineNo">590</span><a name="line.590"></a>
-<span class="sourceLineNo">591</span>      sc1.cancel();<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      Thread.sleep(sleepTime);<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.593"></a>
-<span class="sourceLineNo">594</span><a name="line.594"></a>
-<span class="sourceLineNo">595</span>      sc2.cancel();<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      sc3.cancel();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      sc4.cancel();<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      Thread.sleep(sleepTime);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>      sc5.cancel();<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      Thread.sleep(sleepTime);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    } finally {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      shutdownService(service);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  }<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>  /**<a name="line.609"></a>
-<span class="sourceLineNo">610</span>   * ChoreServices should never have a core pool size that exceeds the number of chores that have<a name="line.610"></a>
-<span class="sourceLineNo">611</span>   * been scheduled with the service. For example, if 4 ScheduledChores are scheduled with a<a name="line.611"></a>
-<span class="sourceLineNo">612</span>   * ChoreService, the number of threads in the ChoreService's core pool should never exceed 4<a name="line.612"></a>
-<span class="sourceLineNo">613</span>   */<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  @Test<a name="line.614"></a>
-<span class="sourceLineNo">615</span>  public void testMaximumChoreServiceThreads() throws InterruptedException {<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    ChoreService service = new ChoreService("testMaximumChoreServiceThreads");<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>    final int period = 100;<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    final int sleepTime = 5 * period;<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>    try {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.622"></a>
-<span class="sourceLineNo">623</span>      // ALWAYS miss their start time since their execution takes longer than their period.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      // Chores that miss their start time will trigger the onChoreMissedStartTime callback<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      // in the ChoreService. This callback will try to increase the number of core pool<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      // threads.<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.628"></a>
-<span class="sourceLineNo">629</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.631"></a>
-<span class="sourceLineNo">632</span><a name="line.632"></a>
-<span class="sourceLineNo">633</span>      service.scheduleChore(sc1);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      service.scheduleChore(sc2);<a name="line.634"></a>
-<span class="sourceLineNo">635</span>      service.scheduleChore(sc3);<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      service.scheduleChore(sc4);<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      service.scheduleChore(sc5);<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>      Thread.sleep(sleepTime);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>      SlowChore sc6 = new SlowChore("sc6", period);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      SlowChore sc7 = new SlowChore("sc7", period);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      SlowChore sc8 = new SlowChore("sc8", period);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      SlowChore sc9 = new SlowChore("sc9", period);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      SlowChore sc10 = new SlowChore("sc10", period);<a name="line.646"></a>
-<span class="sourceLineNo">647</span><a name="line.647"></a>
-<span class="sourceLineNo">648</span>      service.scheduleChore(sc6);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      service.scheduleChore(sc7);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      service.scheduleChore(sc8);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      service.scheduleChore(sc9);<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      service.scheduleChore(sc10);<a name="line.652"></a>
-<span class="sourceLineNo">653</span><a name="line.653"></a>
-<span class="sourceLineNo">654</span>      Thread.sleep(sleepTime);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    } finally {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      shutdownService(service);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    }<a name="line.658"></a>
-<span class="sourceLineNo">659</span>  }<a name="line.659"></a>
-<span class="sourceLineNo">660</span><a name="line.660"></a>
-<span class="sourceLineNo">661</span>  @Test<a name="line.661"></a>
-<span class="sourceLineNo">662</span>  public void testChangingChoreServices() throws InterruptedException {<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    final int period = 100;<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    final int sleepTime = 10;<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    ChoreService service1 = new ChoreService("testChangingChoreServices_1");<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    ChoreService service2 = new ChoreService("testChangingChoreServices_2");<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    ScheduledChore chore = new DoNothingChore("sample", period);<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    try {<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      assertFalse(chore.isScheduled());<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.673"></a>
-<span class="sourceLineNo">674</span><a name="line.674"></a>
-<span class="sourceLineNo">675</span>      service1.scheduleChore(chore);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      Thread.sleep(sleepTime);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      assertTrue(chore.isScheduled());<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      assertTrue(service1.isChoreScheduled(chore));<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>      service2.scheduleChore(chore);<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      Thread.sleep(sleepTime);<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      assertTrue(chore.isScheduled());<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      assertTrue(service2.isChoreScheduled(chore));<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.687"></a>
-<span class="sourceLineNo">688</span><a name="line.688"></a>
-<span class="sourceLineNo">689</span>      chore.cancel();<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      assertFalse(chore.isScheduled());<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    } finally {<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      shutdownService(service1);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      shutdownService(service2);<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span>  }<a name="line.698"></a>
-<span class="sourceLineNo">699</span><a name="line.699"></a>
-<span class="sourceLineNo">700</span>  @Test<a name="line.700"></a>
-<span class="sourceLineNo">701</span>  public void testStopperForScheduledChores() throws InterruptedException {<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    ChoreService service = new ChoreService("testStopperForScheduledChores");<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    Stoppable stopperForGroup1 = new SampleStopper();<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    Stoppable stopperForGroup2 = new SampleStopper();<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    final int period = 100;<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    final int delta = 10;<a name="line.706"></a>
-<span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    try {<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      ScheduledChore chore1_group1 = new DoNothingChore("c1g1", stopperForGroup1, period);<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      ScheduledChore chore2_group1 = new DoNothingChore("c2g1", stopperForGroup1, period);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      ScheduledChore chore3_group1 = new DoNothingChore("c3g1", stopperForGroup1, period);<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      ScheduledChore chore1_group2 = new DoNothingChore("c1g2", stopperForGroup2, period);<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      ScheduledChore chore2_group2 = new DoNothingChore("c2g2", stopperForGroup2, period);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      ScheduledChore chore3_group2 = new DoNothingChore("c3g2", stopperForGroup2, period);<a name="line.715"></a>
-<span class="sourceLineNo">716</span><a name="line.716"></a>
-<span class="sourceLineNo">717</span>      service.scheduleChore(chore1_group1);<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      service.scheduleChore(chore2_group1);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      service.scheduleChore(chore3_group1);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      service.scheduleChore(chore1_group2);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      service.scheduleChore(chore2_group2);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      service.scheduleChore(chore3_group2);<a name="line.722"></a>
-<span class="sourceLineNo">723</span><a name="line.723"></a>
-<span class="sourceLineNo">724</span>      Thread.sleep(delta);<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      Thread.sleep(10 * period);<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      assertTrue(chore1_group1.isScheduled());<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      assertTrue(chore2_group1.isScheduled());<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      assertTrue(chore3_group1.isScheduled());<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      assertTrue(chore1_group2.isScheduled());<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      assertTrue(chore2_group2.isScheduled());<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      assertTrue(chore3_group2.isScheduled());<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>      stopperForGroup1.stop("test stopping group 1");<a name="line.733"></a>
-<span class="sourceLineNo">734</span>      Thread.sleep(period);<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      assertFalse(chore1_group1.isScheduled());<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      assertFalse(chore2_group1.isScheduled());<a name="line.736"></a>
-<span class="sourceLineNo">737</span>      assertFalse(chore3_group1.isScheduled());<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      assertTrue(chore1_group2.isScheduled());<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      assertTrue(chore2_group2.isScheduled());<a name="line.739"></a>
-<span class="sourceLineNo">740</span>      assertTrue(chore3_group2.isScheduled());<a name="line.740"></a>
-<span class="sourceLineNo">741</span><a name="line.741"></a>
-<span class="sourceLineNo">742</span>      stopperForGroup2.stop("test stopping group 2");<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      Thread.sleep(period);<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      assertFalse(chore1_group1.isScheduled());<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      assertFalse(chore2_group1.isScheduled());<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      assertFalse(chore3_group1.isScheduled());<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      assertFalse(chore1_group2.isScheduled());<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      assertFalse(chore2_group2.isScheduled());<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      assertFalse(chore3_group2.isScheduled());<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    } finally {<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      shutdownService(service);<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    }<a name="line.752"></a>
-<span class="sourceLineNo">753</span>  }<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>  @Test<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public void testShutdownCancelsScheduledChores() throws InterruptedException {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>    final int period = 100;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    ChoreService service = new ChoreService("testShutdownCancelsScheduledChores");<a name="line.758"></a>
-<span class="sourceLineNo">759</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.761"></a>
-<span class="sourceLineNo">762</span><a name="line.762"></a>
-<span class="sourceLineNo">763</span>    try {<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      assertTrue(successChore1.isScheduled());<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.766"></a>
-<span class="sourceLineNo">767</span>      assertTrue(successChore2.isScheduled());<a name="line.767"></a>
-<span class="sourceLineNo">768</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      assertTrue(successChore3.isScheduled());<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    } finally {<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      shutdownService(service);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    }<a name="line.772"></a>
-<span class="sourceLineNo">773</span><a name="line.773"></a>
-<span class="sourceLineNo">774</span>    assertFalse(successChore1.isScheduled());<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    assertFalse(successChore2.isScheduled());<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    assertFalse(successChore3.isScheduled());<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  @Test<a name="line.779"></a>
-<span class="sourceLineNo">780</span>  public void testShutdownWorksWhileChoresAreExecuting() throws InterruptedException {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    final int period = 100;<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    final int sleep = 5 * period;<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    ChoreService service = new ChoreService("testShutdownWorksWhileChoresAreExecuting");<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    ScheduledChore slowChore1 = new SleepingChore("sc1", period, sleep);<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    ScheduledChore slowChore2 = new SleepingChore("sc2", period, sleep);<a name="line.785"></a>
-<span class="sourceLineNo">786</span>    ScheduledChore slowChore3 = new SleepingChore("sc3", period, sleep);<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    try {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      assertTrue(service.scheduleChore(slowChore1));<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      assertTrue(service.scheduleChore(slowChore2));<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      assertTrue(service.scheduleChore(slowChore3));<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>      Thread.sleep(sleep / 2);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>      shutdownService(service);<a name="line.793"></a>
-<span class="sourceLineNo">794</span><a name="line.794"></a>
-<span class="sourceLineNo">795</span>      assertFalse(slowChore1.isScheduled());<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      assertFalse(slowChore2.isScheduled());<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      assertFalse(slowChore3.isScheduled());<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      assertTrue(service.isShutdown());<a name="line.798"></a>
-<span class="sourceLineNo">799</span><a name="line.799"></a>
-<span class="sourceLineNo">800</span>      Thread.sleep(5);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      assertTrue(service.isTerminated());<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    } finally {<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      shutdownService(service);<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    }<a name="line.804"></a>
-<span class="sourceLineNo">805</span>  }<a name="line.805"></a>
-<span class="sourceLineNo">806</span><a name="line.806"></a>
-<span class="sourceLineNo">807</span>  @Test<a name="line.807"></a>
-<span class="sourceLineNo">808</span>  public void testShutdownRejectsNewSchedules() throws InterruptedException {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    final int period = 100;<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    ChoreService service = new ChoreService("testShutdownRejectsNewSchedules");<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    ScheduledChore failChore1 = new DoNothingChore("fc1", period);<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    ScheduledChore failChore2 = new DoNothingChore("fc2", period);<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    ScheduledChore failChore3 = new DoNothingChore("fc3", period);<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>    try {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.819"></a>
-<span class="sourceLineNo">820</span>      assertTrue(successChore1.isScheduled());<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      assertTrue(successChore2.isScheduled());<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      assertTrue(successChore3.isScheduled());<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    } finally {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      shutdownService(service);<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>    assertFalse(service.scheduleChore(failChore1));<a name="line.829"></a>
-<span class="sourceLineNo">830</span>    assertFalse(failChore1.isScheduled());<a name="line.830"></a>
-<span class="sourceLineNo">831</span>    assertFalse(service.scheduleChore(failChore2));<a name="line.831"></a>
-<span class="sourceLineNo">832</span>    assertFalse(failChore2.isScheduled());<a name="line.832"></a>
-<span class="sourceLineNo">833</span>    assertFalse(service.scheduleChore(failChore3));<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    assertFalse(failChore3.isScheduled());<a name="line.834"></a>
-<span class="sourceLineNo">835</span>  }<a name="line.835"></a>
-<span class="sourceLineNo">836</span>}<a name="line.836"></a>
+<span class="sourceLineNo">405</span>      assertEquals("Trigger was called 5 times after 10 periods.", 16,<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          chore.getCountOfChoreCalls());<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>      Thread.sleep(10 * period + delta);<a name="line.408"></a>
+<span class="sourceLineNo">409</span><a name="line.409"></a>
+<span class="sourceLineNo">410</span>      // Be loosey-goosey. It used to be '26' but it was a big flakey relying on timing.<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      assertTrue("Expected at least 16 invocations, instead got " + chore.getCountOfChoreCalls(),<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          chore.getCountOfChoreCalls() &gt; 16);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    } finally {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      shutdownService(service);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    }<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  }<a name="line.416"></a>
+<span class="sourceLineNo">417</span><a name="line.417"></a>
+<span class="sourceLineNo">418</span>  @Test<a name="line.418"></a>
+<span class="sourceLineNo">419</span>  public void testCorePoolIncrease() throws InterruptedException {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    final int initialCorePoolSize = 3;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    ChoreService service = new ChoreService("testCorePoolIncrease", initialCorePoolSize, false);<a name="line.421"></a>
+<span class="sourceLineNo">422</span><a name="line.422"></a>
+<span class="sourceLineNo">423</span>    try {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>      assertEquals("Setting core pool size gave unexpected results.", initialCorePoolSize,<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        service.getCorePoolSize());<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>      final int slowChorePeriod = 100;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      SlowChore slowChore1 = new SlowChore("slowChore1", slowChorePeriod);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      SlowChore slowChore2 = new SlowChore("slowChore2", slowChorePeriod);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>      SlowChore slowChore3 = new SlowChore("slowChore3", slowChorePeriod);<a name="line.430"></a>
+<span class="sourceLineNo">431</span><a name="line.431"></a>
+<span class="sourceLineNo">432</span>      service.scheduleChore(slowChore1);<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      service.scheduleChore(slowChore2);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      service.scheduleChore(slowChore3);<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      assertEquals("Should not create more pools than scheduled chores", 3,<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        service.getCorePoolSize());<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>      SlowChore slowChore4 = new SlowChore("slowChore4", slowChorePeriod);<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      service.scheduleChore(slowChore4);<a name="line.441"></a>
+<span class="sourceLineNo">442</span><a name="line.442"></a>
+<span class="sourceLineNo">443</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 4,<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        service.getCorePoolSize());<a name="line.445"></a>
+<span class="sourceLineNo">446</span><a name="line.446"></a>
+<span class="sourceLineNo">447</span>      SlowChore slowChore5 = new SlowChore("slowChore5", slowChorePeriod);<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      service.scheduleChore(slowChore5);<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 5,<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        service.getCorePoolSize());<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    } finally {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      shutdownService(service);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
+<span class="sourceLineNo">457</span><a name="line.457"></a>
+<span class="sourceLineNo">458</span>  @Test<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  public void testCorePoolDecrease() throws InterruptedException {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    final int initialCorePoolSize = 3;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    ChoreService service = new ChoreService("testCorePoolDecrease", initialCorePoolSize, false);<a name="line.461"></a>
+<span class="sourceLineNo">462</span>    final int chorePeriod = 100;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    try {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>      // Slow chores always miss their start time and thus the core pool size should be at least as<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      // large as the number of running slow chores<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      SlowChore slowChore1 = new SlowChore("slowChore1", chorePeriod);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      SlowChore slowChore2 = new SlowChore("slowChore2", chorePeriod);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      SlowChore slowChore3 = new SlowChore("slowChore3", chorePeriod);<a name="line.468"></a>
+<span class="sourceLineNo">469</span><a name="line.469"></a>
+<span class="sourceLineNo">470</span>      service.scheduleChore(slowChore1);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      service.scheduleChore(slowChore2);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>      service.scheduleChore(slowChore3);<a name="line.472"></a>
+<span class="sourceLineNo">473</span><a name="line.473"></a>
+<span class="sourceLineNo">474</span>      Thread.sleep(chorePeriod * 10);<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      assertEquals("Should not create more pools than scheduled chores",<a name="line.475"></a>
+<span class="sourceLineNo">476</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>      SlowChore slowChore4 = new SlowChore("slowChore4", chorePeriod);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      service.scheduleChore(slowChore4);<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      Thread.sleep(chorePeriod * 10);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.481"></a>
+<span class="sourceLineNo">482</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>      SlowChore slowChore5 = new SlowChore("slowChore5", chorePeriod);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      service.scheduleChore(slowChore5);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      Thread.sleep(chorePeriod * 10);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.487"></a>
+<span class="sourceLineNo">488</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>      // Now we begin to cancel the chores that caused an increase in the core thread pool of the<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      // ChoreService. These cancellations should cause a decrease in the core thread pool.<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      slowChore5.cancel();<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      Thread.sleep(chorePeriod * 10);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.495"></a>
+<span class="sourceLineNo">496</span>        service.getCorePoolSize());<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.497"></a>
+<span class="sourceLineNo">498</span><a name="line.498"></a>
+<span class="sourceLineNo">499</span>      slowChore4.cancel();<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      Thread.sleep(chorePeriod * 10);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        service.getCorePoolSize());<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      assertEquals(3, service.getNumberOfChoresMissingStartTime());<a name="line.503"></a>
+<span class="sourceLineNo">504</span><a name="line.504"></a>
+<span class="sourceLineNo">505</span>      slowChore3.cancel();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      Thread.sleep(chorePeriod * 10);<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        service.getCorePoolSize());<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      assertEquals(2, service.getNumberOfChoresMissingStartTime());<a name="line.509"></a>
+<span class="sourceLineNo">510</span><a name="line.510"></a>
+<span class="sourceLineNo">511</span>      slowChore2.cancel();<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      Thread.sleep(chorePeriod * 10);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.513"></a>
+<span class="sourceLineNo">514</span>        service.getCorePoolSize());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.515"></a>
+<span class="sourceLineNo">516</span><a name="line.516"></a>
+<span class="sourceLineNo">517</span>      slowChore1.cancel();<a name="line.517"></a>
+<span class="sourceLineNo">518</span>      Thread.sleep(chorePeriod * 10);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.519"></a>
+<span class="sourceLineNo">520</span>        service.getCorePoolSize());<a name="line.520"></a>
+<span class="sourceLineNo">521</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    } finally {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      shutdownService(service);<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
+<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>  @Test<a name="line.527"></a>
+<span class="sourceLineNo">528</span>  public void testNumberOfRunningChores() throws InterruptedException {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    ChoreService service = new ChoreService("testNumberOfRunningChores");<a name="line.529"></a>
+<span class="sourceLineNo">530</span><a name="line.530"></a>
+<span class="sourceLineNo">531</span>    final int period = 100;<a name="line.531"></a>
+<span class="sourceLineNo">532</span>    final int sleepTime = 5;<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>    try {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      DoNothingChore dn1 = new DoNothingChore("dn1", period);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      DoNothingChore dn2 = new DoNothingChore("dn2", period);<a name="line.536"></a>
+<span class="sourceLineNo">537</span>      DoNothingChore dn3 = new DoNothingChore("dn3", period);<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      DoNothingChore dn4 = new DoNothingChore("dn4", period);<a name="line.538"></a>
+<span class="sourceLineNo">539</span>      DoNothingChore dn5 = new DoNothingChore("dn5", period);<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>      service.scheduleChore(dn1);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      service.scheduleChore(dn2);<a name="line.542"></a>
+<span class="sourceLineNo">543</span>      service.scheduleChore(dn3);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>      service.scheduleChore(dn4);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      service.scheduleChore(dn5);<a name="line.545"></a>
+<span class="sourceLineNo">546</span><a name="line.546"></a>
+<span class="sourceLineNo">547</span>      Thread.sleep(sleepTime);<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      assertEquals("Scheduled chore mismatch", 5, service.getNumberOfScheduledChores());<a name="line.548"></a>
+<span class="sourceLineNo">549</span><a name="line.549"></a>
+<span class="sourceLineNo">550</span>      dn1.cancel();<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      Thread.sleep(sleepTime);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      assertEquals("Scheduled chore mismatch", 4, service.getNumberOfScheduledChores());<a name="line.552"></a>
+<span class="sourceLineNo">553</span><a name="line.553"></a>
+<span class="sourceLineNo">554</span>      dn2.cancel();<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      dn3.cancel();<a name="line.555"></a>
+<span class="sourceLineNo">556</span>      dn4.cancel();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>      Thread.sleep(sleepTime);<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      assertEquals("Scheduled chore mismatch", 1, service.getNumberOfScheduledChores());<a name="line.558"></a>
+<span class="sourceLineNo">559</span><a name="line.559"></a>
+<span class="sourceLineNo">560</span>      dn5.cancel();<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      Thread.sleep(sleepTime);<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      assertEquals("Scheduled chore mismatch", 0, service.getNumberOfScheduledChores());<a name="line.562"></a>
+<span class="sourceLineNo">563</span>    } finally {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      shutdownService(service);<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    }<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  @Test<a name="line.568"></a>
+<span class="sourceLineNo">569</span>  public void testNumberOfChoresMissingStartTime() throws InterruptedException {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    ChoreService service = new ChoreService("testNumberOfChoresMissingStartTime");<a name="line.570"></a>
+<span class="sourceLineNo">571</span><a name="line.571"></a>
+<span class="sourceLineNo">572</span>    final int period = 100;<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    final int sleepTime = 5 * period;<a name="line.573"></a>
+<span class="sourceLineNo">574</span><a name="line.574"></a>
+<span class="sourceLineNo">575</span>    try {<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      // ALWAYS miss their start time since their execution takes longer than their period<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.578"></a>
+<span class="sourceLineNo">579</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.581"></a>
+<span class="sourceLineNo">582</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.582"></a>
+<span class="sourceLineNo">583</span><a name="line.583"></a>
+<span class="sourceLineNo">584</span>      service.scheduleChore(sc1);<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      service.scheduleChore(sc2);<a name="line.585"></a>
+<span class="sourceLineNo">586</span>      service.scheduleChore(sc3);<a name="line.586"></a>
+<span class="sourceLineNo">587</span>      service.scheduleChore(sc4);<a name="line.587"></a>
+<span class="sourceLineNo">588</span>      service.scheduleChore(sc5);<a name="line.588"></a>
+<span class="sourceLineNo">589</span><a name="line.589"></a>
+<span class="sourceLineNo">590</span>      Thread.sleep(sleepTime);<a name="line.590"></a>
+<span class="sourceLineNo">591</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.591"></a>
+<span class="sourceLineNo">592</span><a name="line.592"></a>
+<span class="sourceLineNo">593</span>      sc1.cancel();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>      Thread.sleep(sleepTime);<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>      sc2.cancel();<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      sc3.cancel();<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      sc4.cancel();<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      Thread.sleep(sleepTime);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.601"></a>
+<span class="sourceLineNo">602</span><a name="line.602"></a>
+<span class="sourceLineNo">603</span>      sc5.cancel();<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      Thread.sleep(sleepTime);<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.605"></a>
+<span class="sourceLineNo">606</span>    } finally {<a name="line.606"></a>
+<span class="sourceLineNo">607</span>      shutdownService(service);<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
+<span class="sourceLineNo">609</span>  }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>  /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>   * ChoreServices should never have a core pool size that exceeds the number of chores that have<a name="line.612"></a>
+<span class="sourceLineNo">613</span>   * been scheduled with the service. For example, if 4 ScheduledChores are scheduled with a<a name="line.613"></a>
+<span class="sourceLineNo">614</span>   * ChoreService, the number of threads in the ChoreService's core pool should never exceed 4<a name="line.614"></a>
+<span class="sourceLineNo">615</span>   */<a name="line.615"></a>
+<span class="sourceLineNo">616</span>  @Test<a name="line.616"></a>
+<span class="sourceLineNo">617</span>  public void testMaximumChoreServiceThreads() throws InterruptedException {<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    ChoreService service = new ChoreService("testMaximumChoreServiceThreads");<a name="line.618"></a>
+<span class="sourceLineNo">619</span><a name="line.619"></a>
+<span class="sourceLineNo">620</span>    final int period = 100;<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    final int sleepTime = 5 * period;<a name="line.621"></a>
+<span class="sourceLineNo">622</span><a name="line.622"></a>
+<span class="sourceLineNo">623</span>    try {<a name="line.623"></a>
+<span class="sourceLineNo">624</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      // ALWAYS miss their start time since their execution takes longer than their period.<a name="line.625"></a>
+<span class="sourceLineNo">626</span>      // Chores that miss their start time will trigger the onChoreMissedStartTime callback<a name="line.626"></a>
+<span class="sourceLineNo">627</span>      // in the ChoreService. This callback will try to increase the number of core pool<a name="line.627"></a>
+<span class="sourceLineNo">628</span>      // threads.<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.630"></a>
+<span class="sourceLineNo">631</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.631"></a>
+<span class="sourceLineNo">632</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.632"></a>
+<span class="sourceLineNo">633</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.633"></a>
+<span class="sourceLineNo">634</span><a name="line.634"></a>
+<span class="sourceLineNo">635</span>      service.scheduleChore(sc1);<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      service.scheduleChore(sc2);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      service.scheduleChore(sc3);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>      service.scheduleChore(sc4);<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      service.scheduleChore(sc5);<a name="line.639"></a>
+<span class="sourceLineNo">640</span><a name="line.640"></a>
+<span class="sourceLineNo">641</span>      Thread.sleep(sleepTime);<a name="line.641"></a>
+<span class="sourceLineNo">642</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>      SlowChore sc6 = new SlowChore("sc6", period);<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      SlowChore sc7 = new SlowChore("sc7", period);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>      SlowChore sc8 = new SlowChore("sc8", period);<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      SlowChore sc9 = new SlowChore("sc9", period);<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      SlowChore sc10 = new SlowChore("sc10", period);<a name="line.648"></a>
+<span class="sourceLineNo">649</span><a name="line.649"></a>
+<span class="sourceLineNo">650</span>      service.scheduleChore(sc6);<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      service.scheduleChore(sc7);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      service.scheduleChore(sc8);<a name="line.652"></a>
+<span class="sourceLineNo">653</span>      service.scheduleChore(sc9);<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      service.scheduleChore(sc10);<a name="line.654"></a>
+<span class="sourceLineNo">655</span><a name="line.655"></a>
+<span class="sourceLineNo">656</span>      Thread.sleep(sleepTime);<a name="line.656"></a>
+<span class="sourceLineNo">657</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    } finally {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>      shutdownService(service);<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    }<a name="line.660"></a>
+<span class="sourceLineNo">661</span>  }<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>  @Test<a name="line.663"></a>
+<span class="sourceLineNo">664</span>  public void testChangingChoreServices() throws InterruptedException {<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    final int period = 100;<a name="line.665"></a>
+<span class="sourceLineNo">666</span>    final int sleepTime = 10;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    ChoreService service1 = new ChoreService("testChangingChoreServices_1");<a name="line.667"></a>
+<span class="sourceLineNo">668</span>    ChoreService service2 = new ChoreService("testChangingChoreServices_2");<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    ScheduledChore chore = new DoNothingChore("sample", period);<a name="line.669"></a>
+<span class="sourceLineNo">670</span><a name="line.670"></a>
+<span class="sourceLineNo">671</span>    try {<a name="line.671"></a>
+<span class="sourceLineNo">672</span>      assertFalse(chore.isScheduled());<a name="line.672"></a>
+<span class="sourceLineNo">673</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>      service1.scheduleChore(chore);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>      Thread.sleep(sleepTime);<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      assertTrue(chore.isScheduled());<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      assertTrue(service1.isChoreScheduled(chore));<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.682"></a>
+<span class="sourceLineNo">683</span><a name="line.683"></a>
+<span class="sourceLineNo">684</span>      service2.scheduleChore(chore);<a name="line.684"></a>
+<span class="sourceLineNo">685</span>      Thread.sleep(sleepTime);<a name="line.685"></a>
+<span class="sourceLineNo">686</span>      assertTrue(chore.isScheduled());<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.687"></a>
+<span class="sourceLineNo">688</span>      assertTrue(service2.isChoreScheduled(chore));<a name="line.688"></a>
+<span class="sourceLineNo">689</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.689"></a>
+<span class="sourceLineNo">690</span><a name="line.690"></a>
+<span class="sourceLineNo">691</span>      chore.cancel();<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      assertFalse(chore.isScheduled());<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.695"></a>
+<span class="sourceLineNo">696</span>    } finally {<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      shutdownService(service1);<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      shutdownService(service2);<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    }<a name="line.699"></a>
+<span class="sourceLineNo">700</span>  }<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>  @Test<a name="line.702"></a>
+<span class="sourceLineNo">703</span>  public void testStopperForScheduledChores() throws InterruptedException {<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    ChoreService service = new ChoreService("testStopperForScheduledChores");<a name="line.704"></a>
+<span class="sourceLineNo">705</span>    Stoppable stopperForGroup1 = new SampleStopper();<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    Stoppable stopperForGroup2 = new SampleStopper();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    final int period = 100;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    final int delta = period/10;<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>    try {<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      ScheduledChore chore1_group1 = new DoNothingChore("c1g1", stopperForGroup1, period);<a name="line.711"></a>
+<span class="sourceLineNo">712</span>      ScheduledChore chore2_group1 = new DoNothingChore("c2g1", stopperForGroup1, period);<a name="line.712"></a>
+<span class="sourceLineNo">713</span>      ScheduledChore chore3_group1 = new DoNothingChore("c3g1", stopperForGroup1, period);<a name="line.713"></a>
+<span class="sourceLineNo">714</span><a name="line.714"></a>
+<span class="sourceLineNo">715</span>      ScheduledChore chore1_group2 = new DoNothingChore("c1g2", stopperForGroup2, period);<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      ScheduledChore chore2_group2 = new DoNothingChore("c2g2", stopperForGroup2, period);<a name="line.716"></a>
+<span class="sourceLineNo">717</span>      ScheduledChore chore3_group2 = new DoNothingChore("c3g2", stopperForGroup2, period);<a name="line.717"></a>
+<span class="sourceLineNo">718</span><a name="line.718"></a>
+<span class="sourceLineNo">719</span>      service.scheduleChore(chore1_group1);<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      service.scheduleChore(chore2_group1);<a name="line.720"></a>
+<span class="sourceLineNo">721</span>      service.scheduleChore(chore3_group1);<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      service.scheduleChore(chore1_group2);<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      service.scheduleChore(chore2_group2);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      service.scheduleChore(chore3_group2);<a name="line.724"></a>
+<span class="sourceLineNo">725</span><a name="line.725"></a>
+<span class="sourceLineNo">726</span>      Thread.sleep(delta);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      Thread.sleep(10 * period);<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      assertTrue(chore1_group1.isScheduled());<a name="line.728"></a>
+<span class="sourceLineNo">729</span>      assertTrue(chore2_group1.isScheduled());<a name="line.729"></a>
+<span class="sourceLineNo">730</span>      assertTrue(chore3_group1.isScheduled());<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      assertTrue(chore1_group2.isScheduled());<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      assertTrue(chore2_group2.isScheduled());<a name="line.732"></a>
+<span class="sourceLineNo">733</span>      assertTrue(chore3_group2.isScheduled());<a name="line.733"></a>
+<span class="sourceLineNo">734</span><a name="line.734"></a>
+<span class="sourceLineNo">735</span>      stopperForGroup1.stop("test stopping group 1");<a name="line.735"></a>
+<span class="sourceLineNo">736</span>      Thread.sleep(period);<a name="line.736"></a>
+<span class="sourceLineNo">737</span>      assertFalse(chore1_group1.isScheduled());<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      assertFalse(chore2_group1.isScheduled());<a name="line.738"></a>
+<span class="sourceLineNo">739</span>      assertFalse(chore3_group1.isScheduled());<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      assertTrue(chore1_group2.isScheduled());<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      assertTrue(chore2_group2.isScheduled());<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      assertTrue(chore3_group2.isScheduled());<a name="line.742"></a>
+<span class="sourceLineNo">743</span><a name="line.743"></a>
+<span class="sourceLineNo">744</span>      stopperForGroup2.stop("test stopping group 2");<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      Thread.sleep(period);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      assertFalse(chore1_group1.isScheduled());<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      assertFalse(chore2_group1.isScheduled());<a name="line.747"></a>
+<span class="sourceLineNo">748</span>      assertFalse(chore3_group1.isScheduled());<a name="line.748"></a>
+<span class="sourceLineNo">749</span>      assertFalse(chore1_group2.isScheduled());<a name="line.749"></a>
+<span class="sourceLineNo">750</span>      assertFalse(chore2_group2.isScheduled());<a name="line.750"></a>
+<span class="sourceLineNo">751</span>      assertFalse(chore3_group2.isScheduled());<a name="line.751"></a>
+<span class="sourceLineNo">752</span>    } finally {<a name="line.752"></a>
+<span class="sourceLineNo">753</span>      shutdownService(service);<a name="line.753"></a>
+<span class="sourceLineNo">754</span>    }<a name="line.754"></a>
+<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>  @Test<a name="line.757"></a>
+<span class="sourceLineNo">758</span>  public void testShutdownCancelsScheduledChores() throws InterruptedException {<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    final int period = 100;<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    ChoreService service = new ChoreService("testShutdownCancelsScheduledChores");<a name="line.760"></a>
+<span class="sourceLineNo">761</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.761"></a>
+<span class="sourceLineNo">762</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.762"></a>
+<span class="sourceLineNo">763</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.763"></a>
+<span class="sourceLineNo">764</span><a name="line.764"></a>
+<span class="sourceLineNo">765</span>    try {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      assertTrue(successChore1.isScheduled());<a name="line.767"></a>
+<span class="sourceLineNo">768</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.768"></a>
+<span class="sourceLineNo">769</span>      assertTrue(successChore2.isScheduled());<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.770"></a>
+<span class="sourceLineNo">771</span>      assertTrue(successChore3.isScheduled());<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    } finally {<a name="line.772"></a>
+<span class="sourceLineNo">773</span>      shutdownService(service);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>    assertFalse(successChore1.isScheduled());<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    assertFalse(successChore2.isScheduled());<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    assertFalse(successChore3.isScheduled());<a name="line.778"></a>
+<span class="sourceLineNo">779</span>  }<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>  @Test<a name="line.781"></a>
+<span class="sourceLineNo">782</span>  public void testShutdownWorksWhileChoresAreExecuting() throws InterruptedException {<a name="line.782"></a>
+<span class="sourceLineNo">783</span>    final int period = 100;<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    final int sleep = 5 * period;<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    ChoreService service = new ChoreService("testShutdownWorksWhileChoresAreExecuting");<a name="line.785"></a>
+<span class="sourceLineNo">786</span>    ScheduledChore slowChore1 = new SleepingChore("sc1", period, sleep);<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    ScheduledChore slowChore2 = new SleepingChore("sc2", period, sleep);<a name="line.787"></a>
+<span class="sourceLineNo">788</span>    ScheduledChore slowChore3 = new SleepingChore("sc3", period, sleep);<a name="line.788"></a>
+<span class="sourceLineNo">789</span>    try {<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      assertTrue(service.scheduleChore(slowChore1));<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      assertTrue(service.scheduleChore(slowChore2));<a name="line.791"></a>
+<span class="sourceLineNo">792</span>      assertTrue(service.scheduleChore(slowChore3));<a name="line.792"></a>
+<span class="sourceLineNo">793</span><a name="line.793"></a>
+<span class="sourceLineNo">794</span>      Thread.sleep(sleep / 2);<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      shutdownService(service);<a name="line.795"></a>
+<span class="sourceLineNo">796</span><a name="line.796"></a>
+<span class="sourceLineNo">797</span>      assertFalse(slowChore1.isScheduled());<a name="line.797"></a>
+<span class="sourceLineNo">798</span>      assertFalse(slowChore2.isScheduled());<a name="line.798"></a>
+<span class="sourceLineNo">799</span>      assertFalse(slowChore3.isScheduled());<a name="line.799"></a>
+<span class="sourceLineNo">800</span>      assertTrue(service.isShutdown());<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>      Thread.sleep(5);<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      assertTrue(service.isTerminated());<a name="line.803"></a>
+<span class="sourceLineNo">804</span>    } finally {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>      shutdownService(service);<a name="line.805"></a>
+<span class="sourceLineNo">806</span>    }<a name="line.806"></a>
+<span class="sourceLineNo">807</span>  }<a name="line.807"></a>
+<span class="sourceLineNo">808</span><a name="line.808"></a>
+<span class="sourceLineNo">809</span>  @Test<a name="line.809"></a>
+<span class="sourceLineNo">810</span>  public void testShutdownRejectsNewSchedules() throws InterruptedException {<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    final int period = 100;<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    ChoreService service = new ChoreService("testShutdownRejectsNewSchedules");<a name="line.812"></a>
+<span class="sourceLineNo">813</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    ScheduledChore failChore1 = new DoNothingChore("fc1", period);<a name="line.816"></a>
+<span class="sourceLineNo">817</span>    ScheduledChore failChore2 = new DoNothingChore("fc2", period);<a name="line.817"></a>
+<span class="sourceLineNo">818</span>    ScheduledChore failChore3 = new DoNothingChore("fc3", period);<a name="line.818"></a>
+<span class="sourceLineNo">819</span><a name="line.819"></a>
+<span class="sourceLineNo">820</span>    try {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      assertTrue(successChore1.isScheduled());<a name="line.822"></a>
+<span class="sourceLineNo">823</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.823"></a>
+<span class="sourceLineNo">824</span>      assertTrue(successChore2.isScheduled());<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      assertTrue(successChore3.isScheduled());<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    } finally {<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      shutdownService(service);<a name="line.828"></a>
+<span class="sourceLineNo">829</span>    }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>    assertFalse(service.scheduleChore(failChore1));<a name="line.831"></a>
+<span class="sourceLineNo">832</span>    assertFalse(failChore1.isScheduled());<a name="line.832"></a>
+<span class="sourceLineNo">833</span>    assertFalse(service.scheduleChore(failChore2));<a name="line.833"></a>
+<span class="sourceLineNo">834</span>    assertFalse(failChore2.isScheduled());<a name="line.834"></a>
+<span class="sourceLineNo">835</span>    assertFalse(service.scheduleChore(failChore3));<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    assertFalse(failChore3.isScheduled());<a name="line.836"></a>
+<span class="sourceLineNo">837</span>  }<a name="line.837"></a>
+<span class="sourceLineNo">838</span>}<a name="line.838"></a>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.SlowChore.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.SlowChore.html
index 139ba2f..4fa763e 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.SlowChore.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.SlowChore.html
@@ -362,17 +362,17 @@
 <span class="sourceLineNo">354</span>  public void testFrequencyOfChores() throws InterruptedException {<a name="line.354"></a>
 <span class="sourceLineNo">355</span>    final int period = 100;<a name="line.355"></a>
 <span class="sourceLineNo">356</span>    // Small delta that acts as time buffer (allowing chores to complete if running slowly)<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    final int delta = 5;<a name="line.357"></a>
+<span class="sourceLineNo">357</span>    final int delta = period/5;<a name="line.357"></a>
 <span class="sourceLineNo">358</span>    ChoreService service = new ChoreService("testFrequencyOfChores");<a name="line.358"></a>
 <span class="sourceLineNo">359</span>    CountingChore chore = new CountingChore("countingChore", period);<a name="line.359"></a>
 <span class="sourceLineNo">360</span>    try {<a name="line.360"></a>
 <span class="sourceLineNo">361</span>      service.scheduleChore(chore);<a name="line.361"></a>
 <span class="sourceLineNo">362</span><a name="line.362"></a>
 <span class="sourceLineNo">363</span>      Thread.sleep(10 * period + delta);<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      assertTrue(chore.getCountOfChoreCalls() == 11);<a name="line.364"></a>
+<span class="sourceLineNo">364</span>      assertEquals("10 periods have elapsed.", 11, chore.getCountOfChoreCalls());<a name="line.364"></a>
 <span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>      Thread.sleep(10 * period);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      assertTrue(chore.getCountOfChoreCalls() == 21);<a name="line.367"></a>
+<span class="sourceLineNo">366</span>      Thread.sleep(10 * period + delta);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      assertEquals("20 periods have elapsed.", 21, chore.getCountOfChoreCalls());<a name="line.367"></a>
 <span class="sourceLineNo">368</span>    } finally {<a name="line.368"></a>
 <span class="sourceLineNo">369</span>      shutdownService(service);<a name="line.369"></a>
 <span class="sourceLineNo">370</span>    }<a name="line.370"></a>
@@ -388,14 +388,14 @@
 <span class="sourceLineNo">380</span>  @Test<a name="line.380"></a>
 <span class="sourceLineNo">381</span>  public void testForceTrigger() throws InterruptedException {<a name="line.381"></a>
 <span class="sourceLineNo">382</span>    final int period = 100;<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    final int delta = 10;<a name="line.383"></a>
+<span class="sourceLineNo">383</span>    final int delta = period/10;<a name="line.383"></a>
 <span class="sourceLineNo">384</span>    ChoreService service = new ChoreService("testForceTrigger");<a name="line.384"></a>
 <span class="sourceLineNo">385</span>    final CountingChore chore = new CountingChore("countingChore", period);<a name="line.385"></a>
 <span class="sourceLineNo">386</span>    try {<a name="line.386"></a>
 <span class="sourceLineNo">387</span>      service.scheduleChore(chore);<a name="line.387"></a>
 <span class="sourceLineNo">388</span>      Thread.sleep(10 * period + delta);<a name="line.388"></a>
 <span class="sourceLineNo">389</span><a name="line.389"></a>
-<span class="sourceLineNo">390</span>      assertTrue(chore.getCountOfChoreCalls() == 11);<a name="line.390"></a>
+<span class="sourceLineNo">390</span>      assertEquals("10 periods have elapsed.", 11, chore.getCountOfChoreCalls());<a name="line.390"></a>
 <span class="sourceLineNo">391</span><a name="line.391"></a>
 <span class="sourceLineNo">392</span>      // Force five runs of the chore to occur, sleeping between triggers to ensure the<a name="line.392"></a>
 <span class="sourceLineNo">393</span>      // chore has time to run<a name="line.393"></a>
@@ -410,438 +410,440 @@
 <span class="sourceLineNo">402</span>      chore.triggerNow();<a name="line.402"></a>
 <span class="sourceLineNo">403</span>      Thread.sleep(delta);<a name="line.403"></a>
 <span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>      assertTrue("" + chore.getCountOfChoreCalls(), chore.getCountOfChoreCalls() == 16);<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>      Thread.sleep(10 * period + delta);<a name="line.407"></a>
-<span class="sourceLineNo">408</span><a name="line.408"></a>
-<span class="sourceLineNo">409</span>      // Be loosey-goosey. It used to be '26' but it was a big flakey relying on timing.<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      assertTrue("" + chore.getCountOfChoreCalls(), chore.getCountOfChoreCalls() &gt; 16);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    } finally {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      shutdownService(service);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  @Test<a name="line.416"></a>
-<span class="sourceLineNo">417</span>  public void testCorePoolIncrease() throws InterruptedException {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    final int initialCorePoolSize = 3;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    ChoreService service = new ChoreService("testCorePoolIncrease", initialCorePoolSize, false);<a name="line.419"></a>
-<span class="sourceLineNo">420</span><a name="line.420"></a>
-<span class="sourceLineNo">421</span>    try {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      assertEquals("Should have a core pool of size: " + initialCorePoolSize, initialCorePoolSize,<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        service.getCorePoolSize());<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>      final int slowChorePeriod = 100;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      SlowChore slowChore1 = new SlowChore("slowChore1", slowChorePeriod);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      SlowChore slowChore2 = new SlowChore("slowChore2", slowChorePeriod);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      SlowChore slowChore3 = new SlowChore("slowChore3", slowChorePeriod);<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>      service.scheduleChore(slowChore1);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      service.scheduleChore(slowChore2);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      service.scheduleChore(slowChore3);<a name="line.432"></a>
-<span class="sourceLineNo">433</span><a name="line.433"></a>
-<span class="sourceLineNo">434</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      assertEquals("Should not create more pools than scheduled chores", 3,<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        service.getCorePoolSize());<a name="line.436"></a>
-<span class="sourceLineNo">437</span><a name="line.437"></a>
-<span class="sourceLineNo">438</span>      SlowChore slowChore4 = new SlowChore("slowChore4", slowChorePeriod);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      service.scheduleChore(slowChore4);<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 4,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        service.getCorePoolSize());<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>      SlowChore slowChore5 = new SlowChore("slowChore5", slowChorePeriod);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      service.scheduleChore(slowChore5);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 5,<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        service.getCorePoolSize());<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    } finally {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      shutdownService(service);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>  @Test<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  public void testCorePoolDecrease() throws InterruptedException {<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    final int initialCorePoolSize = 3;<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    ChoreService service = new ChoreService("testCorePoolDecrease", initialCorePoolSize, false);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    final int chorePeriod = 100;<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    try {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      // Slow chores always miss their start time and thus the core pool size should be at least as<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      // large as the number of running slow chores<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      SlowChore slowChore1 = new SlowChore("slowChore1", chorePeriod);<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      SlowChore slowChore2 = new SlowChore("slowChore2", chorePeriod);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      SlowChore slowChore3 = new SlowChore("slowChore3", chorePeriod);<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>      service.scheduleChore(slowChore1);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      service.scheduleChore(slowChore2);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      service.scheduleChore(slowChore3);<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>      Thread.sleep(chorePeriod * 10);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      assertEquals("Should not create more pools than scheduled chores",<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.474"></a>
-<span class="sourceLineNo">475</span><a name="line.475"></a>
-<span class="sourceLineNo">476</span>      SlowChore slowChore4 = new SlowChore("slowChore4", chorePeriod);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      service.scheduleChore(slowChore4);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      Thread.sleep(chorePeriod * 10);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>      SlowChore slowChore5 = new SlowChore("slowChore5", chorePeriod);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      service.scheduleChore(slowChore5);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      Thread.sleep(chorePeriod * 10);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.485"></a>
-<span class="sourceLineNo">486</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.487"></a>
-<span class="sourceLineNo">488</span><a name="line.488"></a>
-<span class="sourceLineNo">489</span>      // Now we begin to cancel the chores that caused an increase in the core thread pool of the<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      // ChoreService. These cancellations should cause a decrease in the core thread pool.<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      slowChore5.cancel();<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      Thread.sleep(chorePeriod * 10);<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        service.getCorePoolSize());<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>      slowChore4.cancel();<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      Thread.sleep(chorePeriod * 10);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        service.getCorePoolSize());<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      assertEquals(3, service.getNumberOfChoresMissingStartTime());<a name="line.501"></a>
-<span class="sourceLineNo">502</span><a name="line.502"></a>
-<span class="sourceLineNo">503</span>      slowChore3.cancel();<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      Thread.sleep(chorePeriod * 10);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.505"></a>
-<span class="sourceLineNo">506</span>        service.getCorePoolSize());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      assertEquals(2, service.getNumberOfChoresMissingStartTime());<a name="line.507"></a>
-<span class="sourceLineNo">508</span><a name="line.508"></a>
-<span class="sourceLineNo">509</span>      slowChore2.cancel();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      Thread.sleep(chorePeriod * 10);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.511"></a>
-<span class="sourceLineNo">512</span>        service.getCorePoolSize());<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>      slowChore1.cancel();<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      Thread.sleep(chorePeriod * 10);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.517"></a>
-<span class="sourceLineNo">518</span>        service.getCorePoolSize());<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    } finally {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      shutdownService(service);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>  }<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>  @Test<a name="line.525"></a>
-<span class="sourceLineNo">526</span>  public void testNumberOfRunningChores() throws InterruptedException {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    ChoreService service = new ChoreService("testNumberOfRunningChores");<a name="line.527"></a>
-<span class="sourceLineNo">528</span><a name="line.528"></a>
-<span class="sourceLineNo">529</span>    final int period = 100;<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    final int sleepTime = 5;<a name="line.530"></a>
-<span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>    try {<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      DoNothingChore dn1 = new DoNothingChore("dn1", period);<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      DoNothingChore dn2 = new DoNothingChore("dn2", period);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      DoNothingChore dn3 = new DoNothingChore("dn3", period);<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      DoNothingChore dn4 = new DoNothingChore("dn4", period);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      DoNothingChore dn5 = new DoNothingChore("dn5", period);<a name="line.537"></a>
-<span class="sourceLineNo">538</span><a name="line.538"></a>
-<span class="sourceLineNo">539</span>      service.scheduleChore(dn1);<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      service.scheduleChore(dn2);<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      service.scheduleChore(dn3);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      service.scheduleChore(dn4);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      service.scheduleChore(dn5);<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>      Thread.sleep(sleepTime);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      assertEquals("Scheduled chore mismatch", 5, service.getNumberOfScheduledChores());<a name="line.546"></a>
-<span class="sourceLineNo">547</span><a name="line.547"></a>
-<span class="sourceLineNo">548</span>      dn1.cancel();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      Thread.sleep(sleepTime);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      assertEquals("Scheduled chore mismatch", 4, service.getNumberOfScheduledChores());<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>      dn2.cancel();<a name="line.552"></a>
-<span class="sourceLineNo">553</span>      dn3.cancel();<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      dn4.cancel();<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      Thread.sleep(sleepTime);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      assertEquals("Scheduled chore mismatch", 1, service.getNumberOfScheduledChores());<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>      dn5.cancel();<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      Thread.sleep(sleepTime);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      assertEquals("Scheduled chore mismatch", 0, service.getNumberOfScheduledChores());<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    } finally {<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      shutdownService(service);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    }<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  }<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>  @Test<a name="line.566"></a>
-<span class="sourceLineNo">567</span>  public void testNumberOfChoresMissingStartTime() throws InterruptedException {<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    ChoreService service = new ChoreService("testNumberOfChoresMissingStartTime");<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>    final int period = 100;<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    final int sleepTime = 5 * period;<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    try {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      // ALWAYS miss their start time since their execution takes longer than their period<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.580"></a>
-<span class="sourceLineNo">581</span><a name="line.581"></a>
-<span class="sourceLineNo">582</span>      service.scheduleChore(sc1);<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      service.scheduleChore(sc2);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      service.scheduleChore(sc3);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      service.scheduleChore(sc4);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      service.scheduleChore(sc5);<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>      Thread.sleep(sleepTime);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.589"></a>
-<span class="sourceLineNo">590</span><a name="line.590"></a>
-<span class="sourceLineNo">591</span>      sc1.cancel();<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      Thread.sleep(sleepTime);<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.593"></a>
-<span class="sourceLineNo">594</span><a name="line.594"></a>
-<span class="sourceLineNo">595</span>      sc2.cancel();<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      sc3.cancel();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      sc4.cancel();<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      Thread.sleep(sleepTime);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>      sc5.cancel();<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      Thread.sleep(sleepTime);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    } finally {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      shutdownService(service);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  }<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>  /**<a name="line.609"></a>
-<span class="sourceLineNo">610</span>   * ChoreServices should never have a core pool size that exceeds the number of chores that have<a name="line.610"></a>
-<span class="sourceLineNo">611</span>   * been scheduled with the service. For example, if 4 ScheduledChores are scheduled with a<a name="line.611"></a>
-<span class="sourceLineNo">612</span>   * ChoreService, the number of threads in the ChoreService's core pool should never exceed 4<a name="line.612"></a>
-<span class="sourceLineNo">613</span>   */<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  @Test<a name="line.614"></a>
-<span class="sourceLineNo">615</span>  public void testMaximumChoreServiceThreads() throws InterruptedException {<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    ChoreService service = new ChoreService("testMaximumChoreServiceThreads");<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>    final int period = 100;<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    final int sleepTime = 5 * period;<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>    try {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.622"></a>
-<span class="sourceLineNo">623</span>      // ALWAYS miss their start time since their execution takes longer than their period.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      // Chores that miss their start time will trigger the onChoreMissedStartTime callback<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      // in the ChoreService. This callback will try to increase the number of core pool<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      // threads.<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.628"></a>
-<span class="sourceLineNo">629</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.631"></a>
-<span class="sourceLineNo">632</span><a name="line.632"></a>
-<span class="sourceLineNo">633</span>      service.scheduleChore(sc1);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      service.scheduleChore(sc2);<a name="line.634"></a>
-<span class="sourceLineNo">635</span>      service.scheduleChore(sc3);<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      service.scheduleChore(sc4);<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      service.scheduleChore(sc5);<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>      Thread.sleep(sleepTime);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>      SlowChore sc6 = new SlowChore("sc6", period);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      SlowChore sc7 = new SlowChore("sc7", period);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      SlowChore sc8 = new SlowChore("sc8", period);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      SlowChore sc9 = new SlowChore("sc9", period);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      SlowChore sc10 = new SlowChore("sc10", period);<a name="line.646"></a>
-<span class="sourceLineNo">647</span><a name="line.647"></a>
-<span class="sourceLineNo">648</span>      service.scheduleChore(sc6);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      service.scheduleChore(sc7);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      service.scheduleChore(sc8);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      service.scheduleChore(sc9);<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      service.scheduleChore(sc10);<a name="line.652"></a>
-<span class="sourceLineNo">653</span><a name="line.653"></a>
-<span class="sourceLineNo">654</span>      Thread.sleep(sleepTime);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    } finally {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      shutdownService(service);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    }<a name="line.658"></a>
-<span class="sourceLineNo">659</span>  }<a name="line.659"></a>
-<span class="sourceLineNo">660</span><a name="line.660"></a>
-<span class="sourceLineNo">661</span>  @Test<a name="line.661"></a>
-<span class="sourceLineNo">662</span>  public void testChangingChoreServices() throws InterruptedException {<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    final int period = 100;<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    final int sleepTime = 10;<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    ChoreService service1 = new ChoreService("testChangingChoreServices_1");<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    ChoreService service2 = new ChoreService("testChangingChoreServices_2");<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    ScheduledChore chore = new DoNothingChore("sample", period);<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    try {<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      assertFalse(chore.isScheduled());<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.673"></a>
-<span class="sourceLineNo">674</span><a name="line.674"></a>
-<span class="sourceLineNo">675</span>      service1.scheduleChore(chore);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      Thread.sleep(sleepTime);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      assertTrue(chore.isScheduled());<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      assertTrue(service1.isChoreScheduled(chore));<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>      service2.scheduleChore(chore);<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      Thread.sleep(sleepTime);<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      assertTrue(chore.isScheduled());<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      assertTrue(service2.isChoreScheduled(chore));<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.687"></a>
-<span class="sourceLineNo">688</span><a name="line.688"></a>
-<span class="sourceLineNo">689</span>      chore.cancel();<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      assertFalse(chore.isScheduled());<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    } finally {<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      shutdownService(service1);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      shutdownService(service2);<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span>  }<a name="line.698"></a>
-<span class="sourceLineNo">699</span><a name="line.699"></a>
-<span class="sourceLineNo">700</span>  @Test<a name="line.700"></a>
-<span class="sourceLineNo">701</span>  public void testStopperForScheduledChores() throws InterruptedException {<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    ChoreService service = new ChoreService("testStopperForScheduledChores");<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    Stoppable stopperForGroup1 = new SampleStopper();<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    Stoppable stopperForGroup2 = new SampleStopper();<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    final int period = 100;<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    final int delta = 10;<a name="line.706"></a>
-<span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    try {<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      ScheduledChore chore1_group1 = new DoNothingChore("c1g1", stopperForGroup1, period);<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      ScheduledChore chore2_group1 = new DoNothingChore("c2g1", stopperForGroup1, period);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      ScheduledChore chore3_group1 = new DoNothingChore("c3g1", stopperForGroup1, period);<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      ScheduledChore chore1_group2 = new DoNothingChore("c1g2", stopperForGroup2, period);<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      ScheduledChore chore2_group2 = new DoNothingChore("c2g2", stopperForGroup2, period);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      ScheduledChore chore3_group2 = new DoNothingChore("c3g2", stopperForGroup2, period);<a name="line.715"></a>
-<span class="sourceLineNo">716</span><a name="line.716"></a>
-<span class="sourceLineNo">717</span>      service.scheduleChore(chore1_group1);<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      service.scheduleChore(chore2_group1);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      service.scheduleChore(chore3_group1);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      service.scheduleChore(chore1_group2);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      service.scheduleChore(chore2_group2);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      service.scheduleChore(chore3_group2);<a name="line.722"></a>
-<span class="sourceLineNo">723</span><a name="line.723"></a>
-<span class="sourceLineNo">724</span>      Thread.sleep(delta);<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      Thread.sleep(10 * period);<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      assertTrue(chore1_group1.isScheduled());<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      assertTrue(chore2_group1.isScheduled());<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      assertTrue(chore3_group1.isScheduled());<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      assertTrue(chore1_group2.isScheduled());<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      assertTrue(chore2_group2.isScheduled());<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      assertTrue(chore3_group2.isScheduled());<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>      stopperForGroup1.stop("test stopping group 1");<a name="line.733"></a>
-<span class="sourceLineNo">734</span>      Thread.sleep(period);<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      assertFalse(chore1_group1.isScheduled());<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      assertFalse(chore2_group1.isScheduled());<a name="line.736"></a>
-<span class="sourceLineNo">737</span>      assertFalse(chore3_group1.isScheduled());<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      assertTrue(chore1_group2.isScheduled());<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      assertTrue(chore2_group2.isScheduled());<a name="line.739"></a>
-<span class="sourceLineNo">740</span>      assertTrue(chore3_group2.isScheduled());<a name="line.740"></a>
-<span class="sourceLineNo">741</span><a name="line.741"></a>
-<span class="sourceLineNo">742</span>      stopperForGroup2.stop("test stopping group 2");<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      Thread.sleep(period);<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      assertFalse(chore1_group1.isScheduled());<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      assertFalse(chore2_group1.isScheduled());<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      assertFalse(chore3_group1.isScheduled());<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      assertFalse(chore1_group2.isScheduled());<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      assertFalse(chore2_group2.isScheduled());<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      assertFalse(chore3_group2.isScheduled());<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    } finally {<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      shutdownService(service);<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    }<a name="line.752"></a>
-<span class="sourceLineNo">753</span>  }<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>  @Test<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public void testShutdownCancelsScheduledChores() throws InterruptedException {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>    final int period = 100;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    ChoreService service = new ChoreService("testShutdownCancelsScheduledChores");<a name="line.758"></a>
-<span class="sourceLineNo">759</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.761"></a>
-<span class="sourceLineNo">762</span><a name="line.762"></a>
-<span class="sourceLineNo">763</span>    try {<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      assertTrue(successChore1.isScheduled());<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.766"></a>
-<span class="sourceLineNo">767</span>      assertTrue(successChore2.isScheduled());<a name="line.767"></a>
-<span class="sourceLineNo">768</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      assertTrue(successChore3.isScheduled());<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    } finally {<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      shutdownService(service);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    }<a name="line.772"></a>
-<span class="sourceLineNo">773</span><a name="line.773"></a>
-<span class="sourceLineNo">774</span>    assertFalse(successChore1.isScheduled());<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    assertFalse(successChore2.isScheduled());<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    assertFalse(successChore3.isScheduled());<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  @Test<a name="line.779"></a>
-<span class="sourceLineNo">780</span>  public void testShutdownWorksWhileChoresAreExecuting() throws InterruptedException {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    final int period = 100;<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    final int sleep = 5 * period;<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    ChoreService service = new ChoreService("testShutdownWorksWhileChoresAreExecuting");<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    ScheduledChore slowChore1 = new SleepingChore("sc1", period, sleep);<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    ScheduledChore slowChore2 = new SleepingChore("sc2", period, sleep);<a name="line.785"></a>
-<span class="sourceLineNo">786</span>    ScheduledChore slowChore3 = new SleepingChore("sc3", period, sleep);<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    try {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      assertTrue(service.scheduleChore(slowChore1));<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      assertTrue(service.scheduleChore(slowChore2));<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      assertTrue(service.scheduleChore(slowChore3));<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>      Thread.sleep(sleep / 2);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>      shutdownService(service);<a name="line.793"></a>
-<span class="sourceLineNo">794</span><a name="line.794"></a>
-<span class="sourceLineNo">795</span>      assertFalse(slowChore1.isScheduled());<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      assertFalse(slowChore2.isScheduled());<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      assertFalse(slowChore3.isScheduled());<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      assertTrue(service.isShutdown());<a name="line.798"></a>
-<span class="sourceLineNo">799</span><a name="line.799"></a>
-<span class="sourceLineNo">800</span>      Thread.sleep(5);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      assertTrue(service.isTerminated());<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    } finally {<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      shutdownService(service);<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    }<a name="line.804"></a>
-<span class="sourceLineNo">805</span>  }<a name="line.805"></a>
-<span class="sourceLineNo">806</span><a name="line.806"></a>
-<span class="sourceLineNo">807</span>  @Test<a name="line.807"></a>
-<span class="sourceLineNo">808</span>  public void testShutdownRejectsNewSchedules() throws InterruptedException {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    final int period = 100;<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    ChoreService service = new ChoreService("testShutdownRejectsNewSchedules");<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    ScheduledChore failChore1 = new DoNothingChore("fc1", period);<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    ScheduledChore failChore2 = new DoNothingChore("fc2", period);<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    ScheduledChore failChore3 = new DoNothingChore("fc3", period);<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>    try {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.819"></a>
-<span class="sourceLineNo">820</span>      assertTrue(successChore1.isScheduled());<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      assertTrue(successChore2.isScheduled());<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      assertTrue(successChore3.isScheduled());<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    } finally {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      shutdownService(service);<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>    assertFalse(service.scheduleChore(failChore1));<a name="line.829"></a>
-<span class="sourceLineNo">830</span>    assertFalse(failChore1.isScheduled());<a name="line.830"></a>
-<span class="sourceLineNo">831</span>    assertFalse(service.scheduleChore(failChore2));<a name="line.831"></a>
-<span class="sourceLineNo">832</span>    assertFalse(failChore2.isScheduled());<a name="line.832"></a>
-<span class="sourceLineNo">833</span>    assertFalse(service.scheduleChore(failChore3));<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    assertFalse(failChore3.isScheduled());<a name="line.834"></a>
-<span class="sourceLineNo">835</span>  }<a name="line.835"></a>
-<span class="sourceLineNo">836</span>}<a name="line.836"></a>
+<span class="sourceLineNo">405</span>      assertEquals("Trigger was called 5 times after 10 periods.", 16,<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          chore.getCountOfChoreCalls());<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>      Thread.sleep(10 * period + delta);<a name="line.408"></a>
+<span class="sourceLineNo">409</span><a name="line.409"></a>
+<span class="sourceLineNo">410</span>      // Be loosey-goosey. It used to be '26' but it was a big flakey relying on timing.<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      assertTrue("Expected at least 16 invocations, instead got " + chore.getCountOfChoreCalls(),<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          chore.getCountOfChoreCalls() &gt; 16);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    } finally {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      shutdownService(service);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    }<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  }<a name="line.416"></a>
+<span class="sourceLineNo">417</span><a name="line.417"></a>
+<span class="sourceLineNo">418</span>  @Test<a name="line.418"></a>
+<span class="sourceLineNo">419</span>  public void testCorePoolIncrease() throws InterruptedException {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    final int initialCorePoolSize = 3;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    ChoreService service = new ChoreService("testCorePoolIncrease", initialCorePoolSize, false);<a name="line.421"></a>
+<span class="sourceLineNo">422</span><a name="line.422"></a>
+<span class="sourceLineNo">423</span>    try {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>      assertEquals("Setting core pool size gave unexpected results.", initialCorePoolSize,<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        service.getCorePoolSize());<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>      final int slowChorePeriod = 100;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      SlowChore slowChore1 = new SlowChore("slowChore1", slowChorePeriod);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      SlowChore slowChore2 = new SlowChore("slowChore2", slowChorePeriod);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>      SlowChore slowChore3 = new SlowChore("slowChore3", slowChorePeriod);<a name="line.430"></a>
+<span class="sourceLineNo">431</span><a name="line.431"></a>
+<span class="sourceLineNo">432</span>      service.scheduleChore(slowChore1);<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      service.scheduleChore(slowChore2);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      service.scheduleChore(slowChore3);<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      assertEquals("Should not create more pools than scheduled chores", 3,<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        service.getCorePoolSize());<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>      SlowChore slowChore4 = new SlowChore("slowChore4", slowChorePeriod);<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      service.scheduleChore(slowChore4);<a name="line.441"></a>
+<span class="sourceLineNo">442</span><a name="line.442"></a>
+<span class="sourceLineNo">443</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 4,<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        service.getCorePoolSize());<a name="line.445"></a>
+<span class="sourceLineNo">446</span><a name="line.446"></a>
+<span class="sourceLineNo">447</span>      SlowChore slowChore5 = new SlowChore("slowChore5", slowChorePeriod);<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      service.scheduleChore(slowChore5);<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 5,<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        service.getCorePoolSize());<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    } finally {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      shutdownService(service);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
+<span class="sourceLineNo">457</span><a name="line.457"></a>
+<span class="sourceLineNo">458</span>  @Test<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  public void testCorePoolDecrease() throws InterruptedException {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    final int initialCorePoolSize = 3;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    ChoreService service = new ChoreService("testCorePoolDecrease", initialCorePoolSize, false);<a name="line.461"></a>
+<span class="sourceLineNo">462</span>    final int chorePeriod = 100;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    try {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>      // Slow chores always miss their start time and thus the core pool size should be at least as<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      // large as the number of running slow chores<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      SlowChore slowChore1 = new SlowChore("slowChore1", chorePeriod);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      SlowChore slowChore2 = new SlowChore("slowChore2", chorePeriod);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      SlowChore slowChore3 = new SlowChore("slowChore3", chorePeriod);<a name="line.468"></a>
+<span class="sourceLineNo">469</span><a name="line.469"></a>
+<span class="sourceLineNo">470</span>      service.scheduleChore(slowChore1);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      service.scheduleChore(slowChore2);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>      service.scheduleChore(slowChore3);<a name="line.472"></a>
+<span class="sourceLineNo">473</span><a name="line.473"></a>
+<span class="sourceLineNo">474</span>      Thread.sleep(chorePeriod * 10);<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      assertEquals("Should not create more pools than scheduled chores",<a name="line.475"></a>
+<span class="sourceLineNo">476</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>      SlowChore slowChore4 = new SlowChore("slowChore4", chorePeriod);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      service.scheduleChore(slowChore4);<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      Thread.sleep(chorePeriod * 10);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.481"></a>
+<span class="sourceLineNo">482</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>      SlowChore slowChore5 = new SlowChore("slowChore5", chorePeriod);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      service.scheduleChore(slowChore5);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      Thread.sleep(chorePeriod * 10);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.487"></a>
+<span class="sourceLineNo">488</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>      // Now we begin to cancel the chores that caused an increase in the core thread pool of the<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      // ChoreService. These cancellations should cause a decrease in the core thread pool.<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      slowChore5.cancel();<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      Thread.sleep(chorePeriod * 10);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.495"></a>
+<span class="sourceLineNo">496</span>        service.getCorePoolSize());<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.497"></a>
+<span class="sourceLineNo">498</span><a name="line.498"></a>
+<span class="sourceLineNo">499</span>      slowChore4.cancel();<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      Thread.sleep(chorePeriod * 10);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        service.getCorePoolSize());<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      assertEquals(3, service.getNumberOfChoresMissingStartTime());<a name="line.503"></a>
+<span class="sourceLineNo">504</span><a name="line.504"></a>
+<span class="sourceLineNo">505</span>      slowChore3.cancel();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      Thread.sleep(chorePeriod * 10);<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        service.getCorePoolSize());<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      assertEquals(2, service.getNumberOfChoresMissingStartTime());<a name="line.509"></a>
+<span class="sourceLineNo">510</span><a name="line.510"></a>
+<span class="sourceLineNo">511</span>      slowChore2.cancel();<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      Thread.sleep(chorePeriod * 10);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.513"></a>
+<span class="sourceLineNo">514</span>        service.getCorePoolSize());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.515"></a>
+<span class="sourceLineNo">516</span><a name="line.516"></a>
+<span class="sourceLineNo">517</span>      slowChore1.cancel();<a name="line.517"></a>
+<span class="sourceLineNo">518</span>      Thread.sleep(chorePeriod * 10);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.519"></a>
+<span class="sourceLineNo">520</span>        service.getCorePoolSize());<a name="line.520"></a>
+<span class="sourceLineNo">521</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    } finally {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      shutdownService(service);<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
+<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>  @Test<a name="line.527"></a>
+<span class="sourceLineNo">528</span>  public void testNumberOfRunningChores() throws InterruptedException {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    ChoreService service = new ChoreService("testNumberOfRunningChores");<a name="line.529"></a>
+<span class="sourceLineNo">530</span><a name="line.530"></a>
+<span class="sourceLineNo">531</span>    final int period = 100;<a name="line.531"></a>
+<span class="sourceLineNo">532</span>    final int sleepTime = 5;<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>    try {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      DoNothingChore dn1 = new DoNothingChore("dn1", period);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      DoNothingChore dn2 = new DoNothingChore("dn2", period);<a name="line.536"></a>
+<span class="sourceLineNo">537</span>      DoNothingChore dn3 = new DoNothingChore("dn3", period);<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      DoNothingChore dn4 = new DoNothingChore("dn4", period);<a name="line.538"></a>
+<span class="sourceLineNo">539</span>      DoNothingChore dn5 = new DoNothingChore("dn5", period);<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>      service.scheduleChore(dn1);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      service.scheduleChore(dn2);<a name="line.542"></a>
+<span class="sourceLineNo">543</span>      service.scheduleChore(dn3);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>      service.scheduleChore(dn4);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      service.scheduleChore(dn5);<a name="line.545"></a>
+<span class="sourceLineNo">546</span><a name="line.546"></a>
+<span class="sourceLineNo">547</span>      Thread.sleep(sleepTime);<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      assertEquals("Scheduled chore mismatch", 5, service.getNumberOfScheduledChores());<a name="line.548"></a>
+<span class="sourceLineNo">549</span><a name="line.549"></a>
+<span class="sourceLineNo">550</span>      dn1.cancel();<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      Thread.sleep(sleepTime);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      assertEquals("Scheduled chore mismatch", 4, service.getNumberOfScheduledChores());<a name="line.552"></a>
+<span class="sourceLineNo">553</span><a name="line.553"></a>
+<span class="sourceLineNo">554</span>      dn2.cancel();<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      dn3.cancel();<a name="line.555"></a>
+<span class="sourceLineNo">556</span>      dn4.cancel();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>      Thread.sleep(sleepTime);<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      assertEquals("Scheduled chore mismatch", 1, service.getNumberOfScheduledChores());<a name="line.558"></a>
+<span class="sourceLineNo">559</span><a name="line.559"></a>
+<span class="sourceLineNo">560</span>      dn5.cancel();<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      Thread.sleep(sleepTime);<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      assertEquals("Scheduled chore mismatch", 0, service.getNumberOfScheduledChores());<a name="line.562"></a>
+<span class="sourceLineNo">563</span>    } finally {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      shutdownService(service);<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    }<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  @Test<a name="line.568"></a>
+<span class="sourceLineNo">569</span>  public void testNumberOfChoresMissingStartTime() throws InterruptedException {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    ChoreService service = new ChoreService("testNumberOfChoresMissingStartTime");<a name="line.570"></a>
+<span class="sourceLineNo">571</span><a name="line.571"></a>
+<span class="sourceLineNo">572</span>    final int period = 100;<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    final int sleepTime = 5 * period;<a name="line.573"></a>
+<span class="sourceLineNo">574</span><a name="line.574"></a>
+<span class="sourceLineNo">575</span>    try {<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      // ALWAYS miss their start time since their execution takes longer than their period<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.578"></a>
+<span class="sourceLineNo">579</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.581"></a>
+<span class="sourceLineNo">582</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.582"></a>
+<span class="sourceLineNo">583</span><a name="line.583"></a>
+<span class="sourceLineNo">584</span>      service.scheduleChore(sc1);<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      service.scheduleChore(sc2);<a name="line.585"></a>
+<span class="sourceLineNo">586</span>      service.scheduleChore(sc3);<a name="line.586"></a>
+<span class="sourceLineNo">587</span>      service.scheduleChore(sc4);<a name="line.587"></a>
+<span class="sourceLineNo">588</span>      service.scheduleChore(sc5);<a name="line.588"></a>
+<span class="sourceLineNo">589</span><a name="line.589"></a>
+<span class="sourceLineNo">590</span>      Thread.sleep(sleepTime);<a name="line.590"></a>
+<span class="sourceLineNo">591</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.591"></a>
+<span class="sourceLineNo">592</span><a name="line.592"></a>
+<span class="sourceLineNo">593</span>      sc1.cancel();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>      Thread.sleep(sleepTime);<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>      sc2.cancel();<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      sc3.cancel();<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      sc4.cancel();<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      Thread.sleep(sleepTime);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.601"></a>
+<span class="sourceLineNo">602</span><a name="line.602"></a>
+<span class="sourceLineNo">603</span>      sc5.cancel();<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      Thread.sleep(sleepTime);<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.605"></a>
+<span class="sourceLineNo">606</span>    } finally {<a name="line.606"></a>
+<span class="sourceLineNo">607</span>      shutdownService(service);<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
+<span class="sourceLineNo">609</span>  }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>  /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>   * ChoreServices should never have a core pool size that exceeds the number of chores that have<a name="line.612"></a>
+<span class="sourceLineNo">613</span>   * been scheduled with the service. For example, if 4 ScheduledChores are scheduled with a<a name="line.613"></a>
+<span class="sourceLineNo">614</span>   * ChoreService, the number of threads in the ChoreService's core pool should never exceed 4<a name="line.614"></a>
+<span class="sourceLineNo">615</span>   */<a name="line.615"></a>
+<span class="sourceLineNo">616</span>  @Test<a name="line.616"></a>
+<span class="sourceLineNo">617</span>  public void testMaximumChoreServiceThreads() throws InterruptedException {<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    ChoreService service = new ChoreService("testMaximumChoreServiceThreads");<a name="line.618"></a>
+<span class="sourceLineNo">619</span><a name="line.619"></a>
+<span class="sourceLineNo">620</span>    final int period = 100;<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    final int sleepTime = 5 * period;<a name="line.621"></a>
+<span class="sourceLineNo">622</span><a name="line.622"></a>
+<span class="sourceLineNo">623</span>    try {<a name="line.623"></a>
+<span class="sourceLineNo">624</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      // ALWAYS miss their start time since their execution takes longer than their period.<a name="line.625"></a>
+<span class="sourceLineNo">626</span>      // Chores that miss their start time will trigger the onChoreMissedStartTime callback<a name="line.626"></a>
+<span class="sourceLineNo">627</span>      // in the ChoreService. This callback will try to increase the number of core pool<a name="line.627"></a>
+<span class="sourceLineNo">628</span>      // threads.<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.630"></a>
+<span class="sourceLineNo">631</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.631"></a>
+<span class="sourceLineNo">632</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.632"></a>
+<span class="sourceLineNo">633</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.633"></a>
+<span class="sourceLineNo">634</span><a name="line.634"></a>
+<span class="sourceLineNo">635</span>      service.scheduleChore(sc1);<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      service.scheduleChore(sc2);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      service.scheduleChore(sc3);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>      service.scheduleChore(sc4);<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      service.scheduleChore(sc5);<a name="line.639"></a>
+<span class="sourceLineNo">640</span><a name="line.640"></a>
+<span class="sourceLineNo">641</span>      Thread.sleep(sleepTime);<a name="line.641"></a>
+<span class="sourceLineNo">642</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>      SlowChore sc6 = new SlowChore("sc6", period);<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      SlowChore sc7 = new SlowChore("sc7", period);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>      SlowChore sc8 = new SlowChore("sc8", period);<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      SlowChore sc9 = new SlowChore("sc9", period);<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      SlowChore sc10 = new SlowChore("sc10", period);<a name="line.648"></a>
+<span class="sourceLineNo">649</span><a name="line.649"></a>
+<span class="sourceLineNo">650</span>      service.scheduleChore(sc6);<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      service.scheduleChore(sc7);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      service.scheduleChore(sc8);<a name="line.652"></a>
+<span class="sourceLineNo">653</span>      service.scheduleChore(sc9);<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      service.scheduleChore(sc10);<a name="line.654"></a>
+<span class="sourceLineNo">655</span><a name="line.655"></a>
+<span class="sourceLineNo">656</span>      Thread.sleep(sleepTime);<a name="line.656"></a>
+<span class="sourceLineNo">657</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    } finally {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>      shutdownService(service);<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    }<a name="line.660"></a>
+<span class="sourceLineNo">661</span>  }<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>  @Test<a name="line.663"></a>
+<span class="sourceLineNo">664</span>  public void testChangingChoreServices() throws InterruptedException {<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    final int period = 100;<a name="line.665"></a>
+<span class="sourceLineNo">666</span>    final int sleepTime = 10;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    ChoreService service1 = new ChoreService("testChangingChoreServices_1");<a name="line.667"></a>
+<span class="sourceLineNo">668</span>    ChoreService service2 = new ChoreService("testChangingChoreServices_2");<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    ScheduledChore chore = new DoNothingChore("sample", period);<a name="line.669"></a>
+<span class="sourceLineNo">670</span><a name="line.670"></a>
+<span class="sourceLineNo">671</span>    try {<a name="line.671"></a>
+<span class="sourceLineNo">672</span>      assertFalse(chore.isScheduled());<a name="line.672"></a>
+<span class="sourceLineNo">673</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>      service1.scheduleChore(chore);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>      Thread.sleep(sleepTime);<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      assertTrue(chore.isScheduled());<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      assertTrue(service1.isChoreScheduled(chore));<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.682"></a>
+<span class="sourceLineNo">683</span><a name="line.683"></a>
+<span class="sourceLineNo">684</span>      service2.scheduleChore(chore);<a name="line.684"></a>
+<span class="sourceLineNo">685</span>      Thread.sleep(sleepTime);<a name="line.685"></a>
+<span class="sourceLineNo">686</span>      assertTrue(chore.isScheduled());<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.687"></a>
+<span class="sourceLineNo">688</span>      assertTrue(service2.isChoreScheduled(chore));<a name="line.688"></a>
+<span class="sourceLineNo">689</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.689"></a>
+<span class="sourceLineNo">690</span><a name="line.690"></a>
+<span class="sourceLineNo">691</span>      chore.cancel();<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      assertFalse(chore.isScheduled());<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.695"></a>
+<span class="sourceLineNo">696</span>    } finally {<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      shutdownService(service1);<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      shutdownService(service2);<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    }<a name="line.699"></a>
+<span class="sourceLineNo">700</span>  }<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>  @Test<a name="line.702"></a>
+<span class="sourceLineNo">703</span>  public void testStopperForScheduledChores() throws InterruptedException {<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    ChoreService service = new ChoreService("testStopperForScheduledChores");<a name="line.704"></a>
+<span class="sourceLineNo">705</span>    Stoppable stopperForGroup1 = new SampleStopper();<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    Stoppable stopperForGroup2 = new SampleStopper();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    final int period = 100;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    final int delta = period/10;<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>    try {<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      ScheduledChore chore1_group1 = new DoNothingChore("c1g1", stopperForGroup1, period);<a name="line.711"></a>
+<span class="sourceLineNo">712</span>      ScheduledChore chore2_group1 = new DoNothingChore("c2g1", stopperForGroup1, period);<a name="line.712"></a>
+<span class="sourceLineNo">713</span>      ScheduledChore chore3_group1 = new DoNothingChore("c3g1", stopperForGroup1, period);<a name="line.713"></a>
+<span class="sourceLineNo">714</span><a name="line.714"></a>
+<span class="sourceLineNo">715</span>      ScheduledChore chore1_group2 = new DoNothingChore("c1g2", stopperForGroup2, period);<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      ScheduledChore chore2_group2 = new DoNothingChore("c2g2", stopperForGroup2, period);<a name="line.716"></a>
+<span class="sourceLineNo">717</span>      ScheduledChore chore3_group2 = new DoNothingChore("c3g2", stopperForGroup2, period);<a name="line.717"></a>
+<span class="sourceLineNo">718</span><a name="line.718"></a>
+<span class="sourceLineNo">719</span>      service.scheduleChore(chore1_group1);<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      service.scheduleChore(chore2_group1);<a name="line.720"></a>
+<span class="sourceLineNo">721</span>      service.scheduleChore(chore3_group1);<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      service.scheduleChore(chore1_group2);<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      service.scheduleChore(chore2_group2);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      service.scheduleChore(chore3_group2);<a name="line.724"></a>
+<span class="sourceLineNo">725</span><a name="line.725"></a>
+<span class="sourceLineNo">726</span>      Thread.sleep(delta);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      Thread.sleep(10 * period);<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      assertTrue(chore1_group1.isScheduled());<a name="line.728"></a>
+<span class="sourceLineNo">729</span>      assertTrue(chore2_group1.isScheduled());<a name="line.729"></a>
+<span class="sourceLineNo">730</span>      assertTrue(chore3_group1.isScheduled());<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      assertTrue(chore1_group2.isScheduled());<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      assertTrue(chore2_group2.isScheduled());<a name="line.732"></a>
+<span class="sourceLineNo">733</span>      assertTrue(chore3_group2.isScheduled());<a name="line.733"></a>
+<span class="sourceLineNo">734</span><a name="line.734"></a>
+<span class="sourceLineNo">735</span>      stopperForGroup1.stop("test stopping group 1");<a name="line.735"></a>
+<span class="sourceLineNo">736</span>      Thread.sleep(period);<a name="line.736"></a>
+<span class="sourceLineNo">737</span>      assertFalse(chore1_group1.isScheduled());<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      assertFalse(chore2_group1.isScheduled());<a name="line.738"></a>
+<span class="sourceLineNo">739</span>      assertFalse(chore3_group1.isScheduled());<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      assertTrue(chore1_group2.isScheduled());<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      assertTrue(chore2_group2.isScheduled());<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      assertTrue(chore3_group2.isScheduled());<a name="line.742"></a>
+<span class="sourceLineNo">743</span><a name="line.743"></a>
+<span class="sourceLineNo">744</span>      stopperForGroup2.stop("test stopping group 2");<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      Thread.sleep(period);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      assertFalse(chore1_group1.isScheduled());<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      assertFalse(chore2_group1.isScheduled());<a name="line.747"></a>
+<span class="sourceLineNo">748</span>      assertFalse(chore3_group1.isScheduled());<a name="line.748"></a>
+<span class="sourceLineNo">749</span>      assertFalse(chore1_group2.isScheduled());<a name="line.749"></a>
+<span class="sourceLineNo">750</span>      assertFalse(chore2_group2.isScheduled());<a name="line.750"></a>
+<span class="sourceLineNo">751</span>      assertFalse(chore3_group2.isScheduled());<a name="line.751"></a>
+<span class="sourceLineNo">752</span>    } finally {<a name="line.752"></a>
+<span class="sourceLineNo">753</span>      shutdownService(service);<a name="line.753"></a>
+<span class="sourceLineNo">754</span>    }<a name="line.754"></a>
+<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>  @Test<a name="line.757"></a>
+<span class="sourceLineNo">758</span>  public void testShutdownCancelsScheduledChores() throws InterruptedException {<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    final int period = 100;<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    ChoreService service = new ChoreService("testShutdownCancelsScheduledChores");<a name="line.760"></a>
+<span class="sourceLineNo">761</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.761"></a>
+<span class="sourceLineNo">762</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.762"></a>
+<span class="sourceLineNo">763</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.763"></a>
+<span class="sourceLineNo">764</span><a name="line.764"></a>
+<span class="sourceLineNo">765</span>    try {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      assertTrue(successChore1.isScheduled());<a name="line.767"></a>
+<span class="sourceLineNo">768</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.768"></a>
+<span class="sourceLineNo">769</span>      assertTrue(successChore2.isScheduled());<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.770"></a>
+<span class="sourceLineNo">771</span>      assertTrue(successChore3.isScheduled());<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    } finally {<a name="line.772"></a>
+<span class="sourceLineNo">773</span>      shutdownService(service);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>    assertFalse(successChore1.isScheduled());<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    assertFalse(successChore2.isScheduled());<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    assertFalse(successChore3.isScheduled());<a name="line.778"></a>
+<span class="sourceLineNo">779</span>  }<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>  @Test<a name="line.781"></a>
+<span class="sourceLineNo">782</span>  public void testShutdownWorksWhileChoresAreExecuting() throws InterruptedException {<a name="line.782"></a>
+<span class="sourceLineNo">783</span>    final int period = 100;<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    final int sleep = 5 * period;<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    ChoreService service = new ChoreService("testShutdownWorksWhileChoresAreExecuting");<a name="line.785"></a>
+<span class="sourceLineNo">786</span>    ScheduledChore slowChore1 = new SleepingChore("sc1", period, sleep);<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    ScheduledChore slowChore2 = new SleepingChore("sc2", period, sleep);<a name="line.787"></a>
+<span class="sourceLineNo">788</span>    ScheduledChore slowChore3 = new SleepingChore("sc3", period, sleep);<a name="line.788"></a>
+<span class="sourceLineNo">789</span>    try {<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      assertTrue(service.scheduleChore(slowChore1));<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      assertTrue(service.scheduleChore(slowChore2));<a name="line.791"></a>
+<span class="sourceLineNo">792</span>      assertTrue(service.scheduleChore(slowChore3));<a name="line.792"></a>
+<span class="sourceLineNo">793</span><a name="line.793"></a>
+<span class="sourceLineNo">794</span>      Thread.sleep(sleep / 2);<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      shutdownService(service);<a name="line.795"></a>
+<span class="sourceLineNo">796</span><a name="line.796"></a>
+<span class="sourceLineNo">797</span>      assertFalse(slowChore1.isScheduled());<a name="line.797"></a>
+<span class="sourceLineNo">798</span>      assertFalse(slowChore2.isScheduled());<a name="line.798"></a>
+<span class="sourceLineNo">799</span>      assertFalse(slowChore3.isScheduled());<a name="line.799"></a>
+<span class="sourceLineNo">800</span>      assertTrue(service.isShutdown());<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>      Thread.sleep(5);<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      assertTrue(service.isTerminated());<a name="line.803"></a>
+<span class="sourceLineNo">804</span>    } finally {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>      shutdownService(service);<a name="line.805"></a>
+<span class="sourceLineNo">806</span>    }<a name="line.806"></a>
+<span class="sourceLineNo">807</span>  }<a name="line.807"></a>
+<span class="sourceLineNo">808</span><a name="line.808"></a>
+<span class="sourceLineNo">809</span>  @Test<a name="line.809"></a>
+<span class="sourceLineNo">810</span>  public void testShutdownRejectsNewSchedules() throws InterruptedException {<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    final int period = 100;<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    ChoreService service = new ChoreService("testShutdownRejectsNewSchedules");<a name="line.812"></a>
+<span class="sourceLineNo">813</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    ScheduledChore failChore1 = new DoNothingChore("fc1", period);<a name="line.816"></a>
+<span class="sourceLineNo">817</span>    ScheduledChore failChore2 = new DoNothingChore("fc2", period);<a name="line.817"></a>
+<span class="sourceLineNo">818</span>    ScheduledChore failChore3 = new DoNothingChore("fc3", period);<a name="line.818"></a>
+<span class="sourceLineNo">819</span><a name="line.819"></a>
+<span class="sourceLineNo">820</span>    try {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      assertTrue(successChore1.isScheduled());<a name="line.822"></a>
+<span class="sourceLineNo">823</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.823"></a>
+<span class="sourceLineNo">824</span>      assertTrue(successChore2.isScheduled());<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      assertTrue(successChore3.isScheduled());<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    } finally {<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      shutdownService(service);<a name="line.828"></a>
+<span class="sourceLineNo">829</span>    }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>    assertFalse(service.scheduleChore(failChore1));<a name="line.831"></a>
+<span class="sourceLineNo">832</span>    assertFalse(failChore1.isScheduled());<a name="line.832"></a>
+<span class="sourceLineNo">833</span>    assertFalse(service.scheduleChore(failChore2));<a name="line.833"></a>
+<span class="sourceLineNo">834</span>    assertFalse(failChore2.isScheduled());<a name="line.834"></a>
+<span class="sourceLineNo">835</span>    assertFalse(service.scheduleChore(failChore3));<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    assertFalse(failChore3.isScheduled());<a name="line.836"></a>
+<span class="sourceLineNo">837</span>  }<a name="line.837"></a>
+<span class="sourceLineNo">838</span>}<a name="line.838"></a>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.html
index 139ba2f..4fa763e 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.ScheduledChoreSamples.html
@@ -362,17 +362,17 @@
 <span class="sourceLineNo">354</span>  public void testFrequencyOfChores() throws InterruptedException {<a name="line.354"></a>
 <span class="sourceLineNo">355</span>    final int period = 100;<a name="line.355"></a>
 <span class="sourceLineNo">356</span>    // Small delta that acts as time buffer (allowing chores to complete if running slowly)<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    final int delta = 5;<a name="line.357"></a>
+<span class="sourceLineNo">357</span>    final int delta = period/5;<a name="line.357"></a>
 <span class="sourceLineNo">358</span>    ChoreService service = new ChoreService("testFrequencyOfChores");<a name="line.358"></a>
 <span class="sourceLineNo">359</span>    CountingChore chore = new CountingChore("countingChore", period);<a name="line.359"></a>
 <span class="sourceLineNo">360</span>    try {<a name="line.360"></a>
 <span class="sourceLineNo">361</span>      service.scheduleChore(chore);<a name="line.361"></a>
 <span class="sourceLineNo">362</span><a name="line.362"></a>
 <span class="sourceLineNo">363</span>      Thread.sleep(10 * period + delta);<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      assertTrue(chore.getCountOfChoreCalls() == 11);<a name="line.364"></a>
+<span class="sourceLineNo">364</span>      assertEquals("10 periods have elapsed.", 11, chore.getCountOfChoreCalls());<a name="line.364"></a>
 <span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>      Thread.sleep(10 * period);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      assertTrue(chore.getCountOfChoreCalls() == 21);<a name="line.367"></a>
+<span class="sourceLineNo">366</span>      Thread.sleep(10 * period + delta);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      assertEquals("20 periods have elapsed.", 21, chore.getCountOfChoreCalls());<a name="line.367"></a>
 <span class="sourceLineNo">368</span>    } finally {<a name="line.368"></a>
 <span class="sourceLineNo">369</span>      shutdownService(service);<a name="line.369"></a>
 <span class="sourceLineNo">370</span>    }<a name="line.370"></a>
@@ -388,14 +388,14 @@
 <span class="sourceLineNo">380</span>  @Test<a name="line.380"></a>
 <span class="sourceLineNo">381</span>  public void testForceTrigger() throws InterruptedException {<a name="line.381"></a>
 <span class="sourceLineNo">382</span>    final int period = 100;<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    final int delta = 10;<a name="line.383"></a>
+<span class="sourceLineNo">383</span>    final int delta = period/10;<a name="line.383"></a>
 <span class="sourceLineNo">384</span>    ChoreService service = new ChoreService("testForceTrigger");<a name="line.384"></a>
 <span class="sourceLineNo">385</span>    final CountingChore chore = new CountingChore("countingChore", period);<a name="line.385"></a>
 <span class="sourceLineNo">386</span>    try {<a name="line.386"></a>
 <span class="sourceLineNo">387</span>      service.scheduleChore(chore);<a name="line.387"></a>
 <span class="sourceLineNo">388</span>      Thread.sleep(10 * period + delta);<a name="line.388"></a>
 <span class="sourceLineNo">389</span><a name="line.389"></a>
-<span class="sourceLineNo">390</span>      assertTrue(chore.getCountOfChoreCalls() == 11);<a name="line.390"></a>
+<span class="sourceLineNo">390</span>      assertEquals("10 periods have elapsed.", 11, chore.getCountOfChoreCalls());<a name="line.390"></a>
 <span class="sourceLineNo">391</span><a name="line.391"></a>
 <span class="sourceLineNo">392</span>      // Force five runs of the chore to occur, sleeping between triggers to ensure the<a name="line.392"></a>
 <span class="sourceLineNo">393</span>      // chore has time to run<a name="line.393"></a>
@@ -410,438 +410,440 @@
 <span class="sourceLineNo">402</span>      chore.triggerNow();<a name="line.402"></a>
 <span class="sourceLineNo">403</span>      Thread.sleep(delta);<a name="line.403"></a>
 <span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>      assertTrue("" + chore.getCountOfChoreCalls(), chore.getCountOfChoreCalls() == 16);<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>      Thread.sleep(10 * period + delta);<a name="line.407"></a>
-<span class="sourceLineNo">408</span><a name="line.408"></a>
-<span class="sourceLineNo">409</span>      // Be loosey-goosey. It used to be '26' but it was a big flakey relying on timing.<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      assertTrue("" + chore.getCountOfChoreCalls(), chore.getCountOfChoreCalls() &gt; 16);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    } finally {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      shutdownService(service);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  @Test<a name="line.416"></a>
-<span class="sourceLineNo">417</span>  public void testCorePoolIncrease() throws InterruptedException {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    final int initialCorePoolSize = 3;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    ChoreService service = new ChoreService("testCorePoolIncrease", initialCorePoolSize, false);<a name="line.419"></a>
-<span class="sourceLineNo">420</span><a name="line.420"></a>
-<span class="sourceLineNo">421</span>    try {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      assertEquals("Should have a core pool of size: " + initialCorePoolSize, initialCorePoolSize,<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        service.getCorePoolSize());<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>      final int slowChorePeriod = 100;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      SlowChore slowChore1 = new SlowChore("slowChore1", slowChorePeriod);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      SlowChore slowChore2 = new SlowChore("slowChore2", slowChorePeriod);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      SlowChore slowChore3 = new SlowChore("slowChore3", slowChorePeriod);<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>      service.scheduleChore(slowChore1);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      service.scheduleChore(slowChore2);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      service.scheduleChore(slowChore3);<a name="line.432"></a>
-<span class="sourceLineNo">433</span><a name="line.433"></a>
-<span class="sourceLineNo">434</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      assertEquals("Should not create more pools than scheduled chores", 3,<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        service.getCorePoolSize());<a name="line.436"></a>
-<span class="sourceLineNo">437</span><a name="line.437"></a>
-<span class="sourceLineNo">438</span>      SlowChore slowChore4 = new SlowChore("slowChore4", slowChorePeriod);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      service.scheduleChore(slowChore4);<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 4,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        service.getCorePoolSize());<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>      SlowChore slowChore5 = new SlowChore("slowChore5", slowChorePeriod);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      service.scheduleChore(slowChore5);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 5,<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        service.getCorePoolSize());<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    } finally {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      shutdownService(service);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>  @Test<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  public void testCorePoolDecrease() throws InterruptedException {<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    final int initialCorePoolSize = 3;<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    ChoreService service = new ChoreService("testCorePoolDecrease", initialCorePoolSize, false);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    final int chorePeriod = 100;<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    try {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      // Slow chores always miss their start time and thus the core pool size should be at least as<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      // large as the number of running slow chores<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      SlowChore slowChore1 = new SlowChore("slowChore1", chorePeriod);<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      SlowChore slowChore2 = new SlowChore("slowChore2", chorePeriod);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      SlowChore slowChore3 = new SlowChore("slowChore3", chorePeriod);<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>      service.scheduleChore(slowChore1);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      service.scheduleChore(slowChore2);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      service.scheduleChore(slowChore3);<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>      Thread.sleep(chorePeriod * 10);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      assertEquals("Should not create more pools than scheduled chores",<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.474"></a>
-<span class="sourceLineNo">475</span><a name="line.475"></a>
-<span class="sourceLineNo">476</span>      SlowChore slowChore4 = new SlowChore("slowChore4", chorePeriod);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      service.scheduleChore(slowChore4);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      Thread.sleep(chorePeriod * 10);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>      SlowChore slowChore5 = new SlowChore("slowChore5", chorePeriod);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      service.scheduleChore(slowChore5);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      Thread.sleep(chorePeriod * 10);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.485"></a>
-<span class="sourceLineNo">486</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.487"></a>
-<span class="sourceLineNo">488</span><a name="line.488"></a>
-<span class="sourceLineNo">489</span>      // Now we begin to cancel the chores that caused an increase in the core thread pool of the<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      // ChoreService. These cancellations should cause a decrease in the core thread pool.<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      slowChore5.cancel();<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      Thread.sleep(chorePeriod * 10);<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        service.getCorePoolSize());<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>      slowChore4.cancel();<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      Thread.sleep(chorePeriod * 10);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        service.getCorePoolSize());<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      assertEquals(3, service.getNumberOfChoresMissingStartTime());<a name="line.501"></a>
-<span class="sourceLineNo">502</span><a name="line.502"></a>
-<span class="sourceLineNo">503</span>      slowChore3.cancel();<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      Thread.sleep(chorePeriod * 10);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.505"></a>
-<span class="sourceLineNo">506</span>        service.getCorePoolSize());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      assertEquals(2, service.getNumberOfChoresMissingStartTime());<a name="line.507"></a>
-<span class="sourceLineNo">508</span><a name="line.508"></a>
-<span class="sourceLineNo">509</span>      slowChore2.cancel();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      Thread.sleep(chorePeriod * 10);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.511"></a>
-<span class="sourceLineNo">512</span>        service.getCorePoolSize());<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>      slowChore1.cancel();<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      Thread.sleep(chorePeriod * 10);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.517"></a>
-<span class="sourceLineNo">518</span>        service.getCorePoolSize());<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    } finally {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      shutdownService(service);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>  }<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>  @Test<a name="line.525"></a>
-<span class="sourceLineNo">526</span>  public void testNumberOfRunningChores() throws InterruptedException {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    ChoreService service = new ChoreService("testNumberOfRunningChores");<a name="line.527"></a>
-<span class="sourceLineNo">528</span><a name="line.528"></a>
-<span class="sourceLineNo">529</span>    final int period = 100;<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    final int sleepTime = 5;<a name="line.530"></a>
-<span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>    try {<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      DoNothingChore dn1 = new DoNothingChore("dn1", period);<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      DoNothingChore dn2 = new DoNothingChore("dn2", period);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      DoNothingChore dn3 = new DoNothingChore("dn3", period);<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      DoNothingChore dn4 = new DoNothingChore("dn4", period);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      DoNothingChore dn5 = new DoNothingChore("dn5", period);<a name="line.537"></a>
-<span class="sourceLineNo">538</span><a name="line.538"></a>
-<span class="sourceLineNo">539</span>      service.scheduleChore(dn1);<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      service.scheduleChore(dn2);<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      service.scheduleChore(dn3);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      service.scheduleChore(dn4);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      service.scheduleChore(dn5);<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>      Thread.sleep(sleepTime);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      assertEquals("Scheduled chore mismatch", 5, service.getNumberOfScheduledChores());<a name="line.546"></a>
-<span class="sourceLineNo">547</span><a name="line.547"></a>
-<span class="sourceLineNo">548</span>      dn1.cancel();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      Thread.sleep(sleepTime);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      assertEquals("Scheduled chore mismatch", 4, service.getNumberOfScheduledChores());<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>      dn2.cancel();<a name="line.552"></a>
-<span class="sourceLineNo">553</span>      dn3.cancel();<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      dn4.cancel();<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      Thread.sleep(sleepTime);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      assertEquals("Scheduled chore mismatch", 1, service.getNumberOfScheduledChores());<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>      dn5.cancel();<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      Thread.sleep(sleepTime);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      assertEquals("Scheduled chore mismatch", 0, service.getNumberOfScheduledChores());<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    } finally {<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      shutdownService(service);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    }<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  }<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>  @Test<a name="line.566"></a>
-<span class="sourceLineNo">567</span>  public void testNumberOfChoresMissingStartTime() throws InterruptedException {<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    ChoreService service = new ChoreService("testNumberOfChoresMissingStartTime");<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>    final int period = 100;<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    final int sleepTime = 5 * period;<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    try {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      // ALWAYS miss their start time since their execution takes longer than their period<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.580"></a>
-<span class="sourceLineNo">581</span><a name="line.581"></a>
-<span class="sourceLineNo">582</span>      service.scheduleChore(sc1);<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      service.scheduleChore(sc2);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      service.scheduleChore(sc3);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      service.scheduleChore(sc4);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      service.scheduleChore(sc5);<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>      Thread.sleep(sleepTime);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.589"></a>
-<span class="sourceLineNo">590</span><a name="line.590"></a>
-<span class="sourceLineNo">591</span>      sc1.cancel();<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      Thread.sleep(sleepTime);<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.593"></a>
-<span class="sourceLineNo">594</span><a name="line.594"></a>
-<span class="sourceLineNo">595</span>      sc2.cancel();<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      sc3.cancel();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      sc4.cancel();<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      Thread.sleep(sleepTime);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>      sc5.cancel();<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      Thread.sleep(sleepTime);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    } finally {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      shutdownService(service);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  }<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>  /**<a name="line.609"></a>
-<span class="sourceLineNo">610</span>   * ChoreServices should never have a core pool size that exceeds the number of chores that have<a name="line.610"></a>
-<span class="sourceLineNo">611</span>   * been scheduled with the service. For example, if 4 ScheduledChores are scheduled with a<a name="line.611"></a>
-<span class="sourceLineNo">612</span>   * ChoreService, the number of threads in the ChoreService's core pool should never exceed 4<a name="line.612"></a>
-<span class="sourceLineNo">613</span>   */<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  @Test<a name="line.614"></a>
-<span class="sourceLineNo">615</span>  public void testMaximumChoreServiceThreads() throws InterruptedException {<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    ChoreService service = new ChoreService("testMaximumChoreServiceThreads");<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>    final int period = 100;<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    final int sleepTime = 5 * period;<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>    try {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.622"></a>
-<span class="sourceLineNo">623</span>      // ALWAYS miss their start time since their execution takes longer than their period.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      // Chores that miss their start time will trigger the onChoreMissedStartTime callback<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      // in the ChoreService. This callback will try to increase the number of core pool<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      // threads.<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.628"></a>
-<span class="sourceLineNo">629</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.631"></a>
-<span class="sourceLineNo">632</span><a name="line.632"></a>
-<span class="sourceLineNo">633</span>      service.scheduleChore(sc1);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      service.scheduleChore(sc2);<a name="line.634"></a>
-<span class="sourceLineNo">635</span>      service.scheduleChore(sc3);<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      service.scheduleChore(sc4);<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      service.scheduleChore(sc5);<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>      Thread.sleep(sleepTime);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>      SlowChore sc6 = new SlowChore("sc6", period);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      SlowChore sc7 = new SlowChore("sc7", period);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      SlowChore sc8 = new SlowChore("sc8", period);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      SlowChore sc9 = new SlowChore("sc9", period);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      SlowChore sc10 = new SlowChore("sc10", period);<a name="line.646"></a>
-<span class="sourceLineNo">647</span><a name="line.647"></a>
-<span class="sourceLineNo">648</span>      service.scheduleChore(sc6);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      service.scheduleChore(sc7);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      service.scheduleChore(sc8);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      service.scheduleChore(sc9);<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      service.scheduleChore(sc10);<a name="line.652"></a>
-<span class="sourceLineNo">653</span><a name="line.653"></a>
-<span class="sourceLineNo">654</span>      Thread.sleep(sleepTime);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    } finally {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      shutdownService(service);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    }<a name="line.658"></a>
-<span class="sourceLineNo">659</span>  }<a name="line.659"></a>
-<span class="sourceLineNo">660</span><a name="line.660"></a>
-<span class="sourceLineNo">661</span>  @Test<a name="line.661"></a>
-<span class="sourceLineNo">662</span>  public void testChangingChoreServices() throws InterruptedException {<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    final int period = 100;<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    final int sleepTime = 10;<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    ChoreService service1 = new ChoreService("testChangingChoreServices_1");<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    ChoreService service2 = new ChoreService("testChangingChoreServices_2");<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    ScheduledChore chore = new DoNothingChore("sample", period);<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    try {<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      assertFalse(chore.isScheduled());<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.673"></a>
-<span class="sourceLineNo">674</span><a name="line.674"></a>
-<span class="sourceLineNo">675</span>      service1.scheduleChore(chore);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      Thread.sleep(sleepTime);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      assertTrue(chore.isScheduled());<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      assertTrue(service1.isChoreScheduled(chore));<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>      service2.scheduleChore(chore);<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      Thread.sleep(sleepTime);<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      assertTrue(chore.isScheduled());<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      assertTrue(service2.isChoreScheduled(chore));<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.687"></a>
-<span class="sourceLineNo">688</span><a name="line.688"></a>
-<span class="sourceLineNo">689</span>      chore.cancel();<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      assertFalse(chore.isScheduled());<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    } finally {<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      shutdownService(service1);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      shutdownService(service2);<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span>  }<a name="line.698"></a>
-<span class="sourceLineNo">699</span><a name="line.699"></a>
-<span class="sourceLineNo">700</span>  @Test<a name="line.700"></a>
-<span class="sourceLineNo">701</span>  public void testStopperForScheduledChores() throws InterruptedException {<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    ChoreService service = new ChoreService("testStopperForScheduledChores");<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    Stoppable stopperForGroup1 = new SampleStopper();<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    Stoppable stopperForGroup2 = new SampleStopper();<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    final int period = 100;<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    final int delta = 10;<a name="line.706"></a>
-<span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    try {<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      ScheduledChore chore1_group1 = new DoNothingChore("c1g1", stopperForGroup1, period);<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      ScheduledChore chore2_group1 = new DoNothingChore("c2g1", stopperForGroup1, period);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      ScheduledChore chore3_group1 = new DoNothingChore("c3g1", stopperForGroup1, period);<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      ScheduledChore chore1_group2 = new DoNothingChore("c1g2", stopperForGroup2, period);<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      ScheduledChore chore2_group2 = new DoNothingChore("c2g2", stopperForGroup2, period);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      ScheduledChore chore3_group2 = new DoNothingChore("c3g2", stopperForGroup2, period);<a name="line.715"></a>
-<span class="sourceLineNo">716</span><a name="line.716"></a>
-<span class="sourceLineNo">717</span>      service.scheduleChore(chore1_group1);<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      service.scheduleChore(chore2_group1);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      service.scheduleChore(chore3_group1);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      service.scheduleChore(chore1_group2);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      service.scheduleChore(chore2_group2);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      service.scheduleChore(chore3_group2);<a name="line.722"></a>
-<span class="sourceLineNo">723</span><a name="line.723"></a>
-<span class="sourceLineNo">724</span>      Thread.sleep(delta);<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      Thread.sleep(10 * period);<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      assertTrue(chore1_group1.isScheduled());<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      assertTrue(chore2_group1.isScheduled());<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      assertTrue(chore3_group1.isScheduled());<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      assertTrue(chore1_group2.isScheduled());<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      assertTrue(chore2_group2.isScheduled());<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      assertTrue(chore3_group2.isScheduled());<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>      stopperForGroup1.stop("test stopping group 1");<a name="line.733"></a>
-<span class="sourceLineNo">734</span>      Thread.sleep(period);<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      assertFalse(chore1_group1.isScheduled());<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      assertFalse(chore2_group1.isScheduled());<a name="line.736"></a>
-<span class="sourceLineNo">737</span>      assertFalse(chore3_group1.isScheduled());<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      assertTrue(chore1_group2.isScheduled());<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      assertTrue(chore2_group2.isScheduled());<a name="line.739"></a>
-<span class="sourceLineNo">740</span>      assertTrue(chore3_group2.isScheduled());<a name="line.740"></a>
-<span class="sourceLineNo">741</span><a name="line.741"></a>
-<span class="sourceLineNo">742</span>      stopperForGroup2.stop("test stopping group 2");<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      Thread.sleep(period);<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      assertFalse(chore1_group1.isScheduled());<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      assertFalse(chore2_group1.isScheduled());<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      assertFalse(chore3_group1.isScheduled());<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      assertFalse(chore1_group2.isScheduled());<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      assertFalse(chore2_group2.isScheduled());<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      assertFalse(chore3_group2.isScheduled());<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    } finally {<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      shutdownService(service);<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    }<a name="line.752"></a>
-<span class="sourceLineNo">753</span>  }<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>  @Test<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public void testShutdownCancelsScheduledChores() throws InterruptedException {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>    final int period = 100;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    ChoreService service = new ChoreService("testShutdownCancelsScheduledChores");<a name="line.758"></a>
-<span class="sourceLineNo">759</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.761"></a>
-<span class="sourceLineNo">762</span><a name="line.762"></a>
-<span class="sourceLineNo">763</span>    try {<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      assertTrue(successChore1.isScheduled());<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.766"></a>
-<span class="sourceLineNo">767</span>      assertTrue(successChore2.isScheduled());<a name="line.767"></a>
-<span class="sourceLineNo">768</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      assertTrue(successChore3.isScheduled());<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    } finally {<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      shutdownService(service);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    }<a name="line.772"></a>
-<span class="sourceLineNo">773</span><a name="line.773"></a>
-<span class="sourceLineNo">774</span>    assertFalse(successChore1.isScheduled());<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    assertFalse(successChore2.isScheduled());<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    assertFalse(successChore3.isScheduled());<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  @Test<a name="line.779"></a>
-<span class="sourceLineNo">780</span>  public void testShutdownWorksWhileChoresAreExecuting() throws InterruptedException {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    final int period = 100;<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    final int sleep = 5 * period;<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    ChoreService service = new ChoreService("testShutdownWorksWhileChoresAreExecuting");<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    ScheduledChore slowChore1 = new SleepingChore("sc1", period, sleep);<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    ScheduledChore slowChore2 = new SleepingChore("sc2", period, sleep);<a name="line.785"></a>
-<span class="sourceLineNo">786</span>    ScheduledChore slowChore3 = new SleepingChore("sc3", period, sleep);<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    try {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      assertTrue(service.scheduleChore(slowChore1));<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      assertTrue(service.scheduleChore(slowChore2));<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      assertTrue(service.scheduleChore(slowChore3));<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>      Thread.sleep(sleep / 2);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>      shutdownService(service);<a name="line.793"></a>
-<span class="sourceLineNo">794</span><a name="line.794"></a>
-<span class="sourceLineNo">795</span>      assertFalse(slowChore1.isScheduled());<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      assertFalse(slowChore2.isScheduled());<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      assertFalse(slowChore3.isScheduled());<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      assertTrue(service.isShutdown());<a name="line.798"></a>
-<span class="sourceLineNo">799</span><a name="line.799"></a>
-<span class="sourceLineNo">800</span>      Thread.sleep(5);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      assertTrue(service.isTerminated());<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    } finally {<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      shutdownService(service);<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    }<a name="line.804"></a>
-<span class="sourceLineNo">805</span>  }<a name="line.805"></a>
-<span class="sourceLineNo">806</span><a name="line.806"></a>
-<span class="sourceLineNo">807</span>  @Test<a name="line.807"></a>
-<span class="sourceLineNo">808</span>  public void testShutdownRejectsNewSchedules() throws InterruptedException {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    final int period = 100;<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    ChoreService service = new ChoreService("testShutdownRejectsNewSchedules");<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    ScheduledChore failChore1 = new DoNothingChore("fc1", period);<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    ScheduledChore failChore2 = new DoNothingChore("fc2", period);<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    ScheduledChore failChore3 = new DoNothingChore("fc3", period);<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>    try {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.819"></a>
-<span class="sourceLineNo">820</span>      assertTrue(successChore1.isScheduled());<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      assertTrue(successChore2.isScheduled());<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      assertTrue(successChore3.isScheduled());<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    } finally {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      shutdownService(service);<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>    assertFalse(service.scheduleChore(failChore1));<a name="line.829"></a>
-<span class="sourceLineNo">830</span>    assertFalse(failChore1.isScheduled());<a name="line.830"></a>
-<span class="sourceLineNo">831</span>    assertFalse(service.scheduleChore(failChore2));<a name="line.831"></a>
-<span class="sourceLineNo">832</span>    assertFalse(failChore2.isScheduled());<a name="line.832"></a>
-<span class="sourceLineNo">833</span>    assertFalse(service.scheduleChore(failChore3));<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    assertFalse(failChore3.isScheduled());<a name="line.834"></a>
-<span class="sourceLineNo">835</span>  }<a name="line.835"></a>
-<span class="sourceLineNo">836</span>}<a name="line.836"></a>
+<span class="sourceLineNo">405</span>      assertEquals("Trigger was called 5 times after 10 periods.", 16,<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          chore.getCountOfChoreCalls());<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>      Thread.sleep(10 * period + delta);<a name="line.408"></a>
+<span class="sourceLineNo">409</span><a name="line.409"></a>
+<span class="sourceLineNo">410</span>      // Be loosey-goosey. It used to be '26' but it was a big flakey relying on timing.<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      assertTrue("Expected at least 16 invocations, instead got " + chore.getCountOfChoreCalls(),<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          chore.getCountOfChoreCalls() &gt; 16);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    } finally {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      shutdownService(service);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    }<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  }<a name="line.416"></a>
+<span class="sourceLineNo">417</span><a name="line.417"></a>
+<span class="sourceLineNo">418</span>  @Test<a name="line.418"></a>
+<span class="sourceLineNo">419</span>  public void testCorePoolIncrease() throws InterruptedException {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    final int initialCorePoolSize = 3;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    ChoreService service = new ChoreService("testCorePoolIncrease", initialCorePoolSize, false);<a name="line.421"></a>
+<span class="sourceLineNo">422</span><a name="line.422"></a>
+<span class="sourceLineNo">423</span>    try {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>      assertEquals("Setting core pool size gave unexpected results.", initialCorePoolSize,<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        service.getCorePoolSize());<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>      final int slowChorePeriod = 100;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      SlowChore slowChore1 = new SlowChore("slowChore1", slowChorePeriod);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      SlowChore slowChore2 = new SlowChore("slowChore2", slowChorePeriod);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>      SlowChore slowChore3 = new SlowChore("slowChore3", slowChorePeriod);<a name="line.430"></a>
+<span class="sourceLineNo">431</span><a name="line.431"></a>
+<span class="sourceLineNo">432</span>      service.scheduleChore(slowChore1);<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      service.scheduleChore(slowChore2);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      service.scheduleChore(slowChore3);<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      assertEquals("Should not create more pools than scheduled chores", 3,<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        service.getCorePoolSize());<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>      SlowChore slowChore4 = new SlowChore("slowChore4", slowChorePeriod);<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      service.scheduleChore(slowChore4);<a name="line.441"></a>
+<span class="sourceLineNo">442</span><a name="line.442"></a>
+<span class="sourceLineNo">443</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 4,<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        service.getCorePoolSize());<a name="line.445"></a>
+<span class="sourceLineNo">446</span><a name="line.446"></a>
+<span class="sourceLineNo">447</span>      SlowChore slowChore5 = new SlowChore("slowChore5", slowChorePeriod);<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      service.scheduleChore(slowChore5);<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 5,<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        service.getCorePoolSize());<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    } finally {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      shutdownService(service);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
+<span class="sourceLineNo">457</span><a name="line.457"></a>
+<span class="sourceLineNo">458</span>  @Test<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  public void testCorePoolDecrease() throws InterruptedException {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    final int initialCorePoolSize = 3;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    ChoreService service = new ChoreService("testCorePoolDecrease", initialCorePoolSize, false);<a name="line.461"></a>
+<span class="sourceLineNo">462</span>    final int chorePeriod = 100;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    try {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>      // Slow chores always miss their start time and thus the core pool size should be at least as<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      // large as the number of running slow chores<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      SlowChore slowChore1 = new SlowChore("slowChore1", chorePeriod);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      SlowChore slowChore2 = new SlowChore("slowChore2", chorePeriod);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      SlowChore slowChore3 = new SlowChore("slowChore3", chorePeriod);<a name="line.468"></a>
+<span class="sourceLineNo">469</span><a name="line.469"></a>
+<span class="sourceLineNo">470</span>      service.scheduleChore(slowChore1);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      service.scheduleChore(slowChore2);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>      service.scheduleChore(slowChore3);<a name="line.472"></a>
+<span class="sourceLineNo">473</span><a name="line.473"></a>
+<span class="sourceLineNo">474</span>      Thread.sleep(chorePeriod * 10);<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      assertEquals("Should not create more pools than scheduled chores",<a name="line.475"></a>
+<span class="sourceLineNo">476</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>      SlowChore slowChore4 = new SlowChore("slowChore4", chorePeriod);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      service.scheduleChore(slowChore4);<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      Thread.sleep(chorePeriod * 10);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.481"></a>
+<span class="sourceLineNo">482</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>      SlowChore slowChore5 = new SlowChore("slowChore5", chorePeriod);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      service.scheduleChore(slowChore5);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      Thread.sleep(chorePeriod * 10);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.487"></a>
+<span class="sourceLineNo">488</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>      // Now we begin to cancel the chores that caused an increase in the core thread pool of the<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      // ChoreService. These cancellations should cause a decrease in the core thread pool.<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      slowChore5.cancel();<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      Thread.sleep(chorePeriod * 10);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.495"></a>
+<span class="sourceLineNo">496</span>        service.getCorePoolSize());<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.497"></a>
+<span class="sourceLineNo">498</span><a name="line.498"></a>
+<span class="sourceLineNo">499</span>      slowChore4.cancel();<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      Thread.sleep(chorePeriod * 10);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        service.getCorePoolSize());<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      assertEquals(3, service.getNumberOfChoresMissingStartTime());<a name="line.503"></a>
+<span class="sourceLineNo">504</span><a name="line.504"></a>
+<span class="sourceLineNo">505</span>      slowChore3.cancel();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      Thread.sleep(chorePeriod * 10);<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        service.getCorePoolSize());<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      assertEquals(2, service.getNumberOfChoresMissingStartTime());<a name="line.509"></a>
+<span class="sourceLineNo">510</span><a name="line.510"></a>
+<span class="sourceLineNo">511</span>      slowChore2.cancel();<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      Thread.sleep(chorePeriod * 10);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.513"></a>
+<span class="sourceLineNo">514</span>        service.getCorePoolSize());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.515"></a>
+<span class="sourceLineNo">516</span><a name="line.516"></a>
+<span class="sourceLineNo">517</span>      slowChore1.cancel();<a name="line.517"></a>
+<span class="sourceLineNo">518</span>      Thread.sleep(chorePeriod * 10);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.519"></a>
+<span class="sourceLineNo">520</span>        service.getCorePoolSize());<a name="line.520"></a>
+<span class="sourceLineNo">521</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    } finally {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      shutdownService(service);<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
+<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>  @Test<a name="line.527"></a>
+<span class="sourceLineNo">528</span>  public void testNumberOfRunningChores() throws InterruptedException {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    ChoreService service = new ChoreService("testNumberOfRunningChores");<a name="line.529"></a>
+<span class="sourceLineNo">530</span><a name="line.530"></a>
+<span class="sourceLineNo">531</span>    final int period = 100;<a name="line.531"></a>
+<span class="sourceLineNo">532</span>    final int sleepTime = 5;<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>    try {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      DoNothingChore dn1 = new DoNothingChore("dn1", period);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      DoNothingChore dn2 = new DoNothingChore("dn2", period);<a name="line.536"></a>
+<span class="sourceLineNo">537</span>      DoNothingChore dn3 = new DoNothingChore("dn3", period);<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      DoNothingChore dn4 = new DoNothingChore("dn4", period);<a name="line.538"></a>
+<span class="sourceLineNo">539</span>      DoNothingChore dn5 = new DoNothingChore("dn5", period);<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>      service.scheduleChore(dn1);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      service.scheduleChore(dn2);<a name="line.542"></a>
+<span class="sourceLineNo">543</span>      service.scheduleChore(dn3);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>      service.scheduleChore(dn4);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      service.scheduleChore(dn5);<a name="line.545"></a>
+<span class="sourceLineNo">546</span><a name="line.546"></a>
+<span class="sourceLineNo">547</span>      Thread.sleep(sleepTime);<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      assertEquals("Scheduled chore mismatch", 5, service.getNumberOfScheduledChores());<a name="line.548"></a>
+<span class="sourceLineNo">549</span><a name="line.549"></a>
+<span class="sourceLineNo">550</span>      dn1.cancel();<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      Thread.sleep(sleepTime);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      assertEquals("Scheduled chore mismatch", 4, service.getNumberOfScheduledChores());<a name="line.552"></a>
+<span class="sourceLineNo">553</span><a name="line.553"></a>
+<span class="sourceLineNo">554</span>      dn2.cancel();<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      dn3.cancel();<a name="line.555"></a>
+<span class="sourceLineNo">556</span>      dn4.cancel();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>      Thread.sleep(sleepTime);<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      assertEquals("Scheduled chore mismatch", 1, service.getNumberOfScheduledChores());<a name="line.558"></a>
+<span class="sourceLineNo">559</span><a name="line.559"></a>
+<span class="sourceLineNo">560</span>      dn5.cancel();<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      Thread.sleep(sleepTime);<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      assertEquals("Scheduled chore mismatch", 0, service.getNumberOfScheduledChores());<a name="line.562"></a>
+<span class="sourceLineNo">563</span>    } finally {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      shutdownService(service);<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    }<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  @Test<a name="line.568"></a>
+<span class="sourceLineNo">569</span>  public void testNumberOfChoresMissingStartTime() throws InterruptedException {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    ChoreService service = new ChoreService("testNumberOfChoresMissingStartTime");<a name="line.570"></a>
+<span class="sourceLineNo">571</span><a name="line.571"></a>
+<span class="sourceLineNo">572</span>    final int period = 100;<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    final int sleepTime = 5 * period;<a name="line.573"></a>
+<span class="sourceLineNo">574</span><a name="line.574"></a>
+<span class="sourceLineNo">575</span>    try {<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      // ALWAYS miss their start time since their execution takes longer than their period<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.578"></a>
+<span class="sourceLineNo">579</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.581"></a>
+<span class="sourceLineNo">582</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.582"></a>
+<span class="sourceLineNo">583</span><a name="line.583"></a>
+<span class="sourceLineNo">584</span>      service.scheduleChore(sc1);<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      service.scheduleChore(sc2);<a name="line.585"></a>
+<span class="sourceLineNo">586</span>      service.scheduleChore(sc3);<a name="line.586"></a>
+<span class="sourceLineNo">587</span>      service.scheduleChore(sc4);<a name="line.587"></a>
+<span class="sourceLineNo">588</span>      service.scheduleChore(sc5);<a name="line.588"></a>
+<span class="sourceLineNo">589</span><a name="line.589"></a>
+<span class="sourceLineNo">590</span>      Thread.sleep(sleepTime);<a name="line.590"></a>
+<span class="sourceLineNo">591</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.591"></a>
+<span class="sourceLineNo">592</span><a name="line.592"></a>
+<span class="sourceLineNo">593</span>      sc1.cancel();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>      Thread.sleep(sleepTime);<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>      sc2.cancel();<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      sc3.cancel();<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      sc4.cancel();<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      Thread.sleep(sleepTime);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.601"></a>
+<span class="sourceLineNo">602</span><a name="line.602"></a>
+<span class="sourceLineNo">603</span>      sc5.cancel();<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      Thread.sleep(sleepTime);<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.605"></a>
+<span class="sourceLineNo">606</span>    } finally {<a name="line.606"></a>
+<span class="sourceLineNo">607</span>      shutdownService(service);<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
+<span class="sourceLineNo">609</span>  }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>  /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>   * ChoreServices should never have a core pool size that exceeds the number of chores that have<a name="line.612"></a>
+<span class="sourceLineNo">613</span>   * been scheduled with the service. For example, if 4 ScheduledChores are scheduled with a<a name="line.613"></a>
+<span class="sourceLineNo">614</span>   * ChoreService, the number of threads in the ChoreService's core pool should never exceed 4<a name="line.614"></a>
+<span class="sourceLineNo">615</span>   */<a name="line.615"></a>
+<span class="sourceLineNo">616</span>  @Test<a name="line.616"></a>
+<span class="sourceLineNo">617</span>  public void testMaximumChoreServiceThreads() throws InterruptedException {<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    ChoreService service = new ChoreService("testMaximumChoreServiceThreads");<a name="line.618"></a>
+<span class="sourceLineNo">619</span><a name="line.619"></a>
+<span class="sourceLineNo">620</span>    final int period = 100;<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    final int sleepTime = 5 * period;<a name="line.621"></a>
+<span class="sourceLineNo">622</span><a name="line.622"></a>
+<span class="sourceLineNo">623</span>    try {<a name="line.623"></a>
+<span class="sourceLineNo">624</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      // ALWAYS miss their start time since their execution takes longer than their period.<a name="line.625"></a>
+<span class="sourceLineNo">626</span>      // Chores that miss their start time will trigger the onChoreMissedStartTime callback<a name="line.626"></a>
+<span class="sourceLineNo">627</span>      // in the ChoreService. This callback will try to increase the number of core pool<a name="line.627"></a>
+<span class="sourceLineNo">628</span>      // threads.<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.630"></a>
+<span class="sourceLineNo">631</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.631"></a>
+<span class="sourceLineNo">632</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.632"></a>
+<span class="sourceLineNo">633</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.633"></a>
+<span class="sourceLineNo">634</span><a name="line.634"></a>
+<span class="sourceLineNo">635</span>      service.scheduleChore(sc1);<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      service.scheduleChore(sc2);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      service.scheduleChore(sc3);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>      service.scheduleChore(sc4);<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      service.scheduleChore(sc5);<a name="line.639"></a>
+<span class="sourceLineNo">640</span><a name="line.640"></a>
+<span class="sourceLineNo">641</span>      Thread.sleep(sleepTime);<a name="line.641"></a>
+<span class="sourceLineNo">642</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>      SlowChore sc6 = new SlowChore("sc6", period);<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      SlowChore sc7 = new SlowChore("sc7", period);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>      SlowChore sc8 = new SlowChore("sc8", period);<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      SlowChore sc9 = new SlowChore("sc9", period);<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      SlowChore sc10 = new SlowChore("sc10", period);<a name="line.648"></a>
+<span class="sourceLineNo">649</span><a name="line.649"></a>
+<span class="sourceLineNo">650</span>      service.scheduleChore(sc6);<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      service.scheduleChore(sc7);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      service.scheduleChore(sc8);<a name="line.652"></a>
+<span class="sourceLineNo">653</span>      service.scheduleChore(sc9);<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      service.scheduleChore(sc10);<a name="line.654"></a>
+<span class="sourceLineNo">655</span><a name="line.655"></a>
+<span class="sourceLineNo">656</span>      Thread.sleep(sleepTime);<a name="line.656"></a>
+<span class="sourceLineNo">657</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    } finally {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>      shutdownService(service);<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    }<a name="line.660"></a>
+<span class="sourceLineNo">661</span>  }<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>  @Test<a name="line.663"></a>
+<span class="sourceLineNo">664</span>  public void testChangingChoreServices() throws InterruptedException {<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    final int period = 100;<a name="line.665"></a>
+<span class="sourceLineNo">666</span>    final int sleepTime = 10;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    ChoreService service1 = new ChoreService("testChangingChoreServices_1");<a name="line.667"></a>
+<span class="sourceLineNo">668</span>    ChoreService service2 = new ChoreService("testChangingChoreServices_2");<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    ScheduledChore chore = new DoNothingChore("sample", period);<a name="line.669"></a>
+<span class="sourceLineNo">670</span><a name="line.670"></a>
+<span class="sourceLineNo">671</span>    try {<a name="line.671"></a>
+<span class="sourceLineNo">672</span>      assertFalse(chore.isScheduled());<a name="line.672"></a>
+<span class="sourceLineNo">673</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>      service1.scheduleChore(chore);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>      Thread.sleep(sleepTime);<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      assertTrue(chore.isScheduled());<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      assertTrue(service1.isChoreScheduled(chore));<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.682"></a>
+<span class="sourceLineNo">683</span><a name="line.683"></a>
+<span class="sourceLineNo">684</span>      service2.scheduleChore(chore);<a name="line.684"></a>
+<span class="sourceLineNo">685</span>      Thread.sleep(sleepTime);<a name="line.685"></a>
+<span class="sourceLineNo">686</span>      assertTrue(chore.isScheduled());<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.687"></a>
+<span class="sourceLineNo">688</span>      assertTrue(service2.isChoreScheduled(chore));<a name="line.688"></a>
+<span class="sourceLineNo">689</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.689"></a>
+<span class="sourceLineNo">690</span><a name="line.690"></a>
+<span class="sourceLineNo">691</span>      chore.cancel();<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      assertFalse(chore.isScheduled());<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.695"></a>
+<span class="sourceLineNo">696</span>    } finally {<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      shutdownService(service1);<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      shutdownService(service2);<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    }<a name="line.699"></a>
+<span class="sourceLineNo">700</span>  }<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>  @Test<a name="line.702"></a>
+<span class="sourceLineNo">703</span>  public void testStopperForScheduledChores() throws InterruptedException {<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    ChoreService service = new ChoreService("testStopperForScheduledChores");<a name="line.704"></a>
+<span class="sourceLineNo">705</span>    Stoppable stopperForGroup1 = new SampleStopper();<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    Stoppable stopperForGroup2 = new SampleStopper();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    final int period = 100;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    final int delta = period/10;<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>    try {<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      ScheduledChore chore1_group1 = new DoNothingChore("c1g1", stopperForGroup1, period);<a name="line.711"></a>
+<span class="sourceLineNo">712</span>      ScheduledChore chore2_group1 = new DoNothingChore("c2g1", stopperForGroup1, period);<a name="line.712"></a>
+<span class="sourceLineNo">713</span>      ScheduledChore chore3_group1 = new DoNothingChore("c3g1", stopperForGroup1, period);<a name="line.713"></a>
+<span class="sourceLineNo">714</span><a name="line.714"></a>
+<span class="sourceLineNo">715</span>      ScheduledChore chore1_group2 = new DoNothingChore("c1g2", stopperForGroup2, period);<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      ScheduledChore chore2_group2 = new DoNothingChore("c2g2", stopperForGroup2, period);<a name="line.716"></a>
+<span class="sourceLineNo">717</span>      ScheduledChore chore3_group2 = new DoNothingChore("c3g2", stopperForGroup2, period);<a name="line.717"></a>
+<span class="sourceLineNo">718</span><a name="line.718"></a>
+<span class="sourceLineNo">719</span>      service.scheduleChore(chore1_group1);<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      service.scheduleChore(chore2_group1);<a name="line.720"></a>
+<span class="sourceLineNo">721</span>      service.scheduleChore(chore3_group1);<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      service.scheduleChore(chore1_group2);<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      service.scheduleChore(chore2_group2);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      service.scheduleChore(chore3_group2);<a name="line.724"></a>
+<span class="sourceLineNo">725</span><a name="line.725"></a>
+<span class="sourceLineNo">726</span>      Thread.sleep(delta);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      Thread.sleep(10 * period);<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      assertTrue(chore1_group1.isScheduled());<a name="line.728"></a>
+<span class="sourceLineNo">729</span>      assertTrue(chore2_group1.isScheduled());<a name="line.729"></a>
+<span class="sourceLineNo">730</span>      assertTrue(chore3_group1.isScheduled());<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      assertTrue(chore1_group2.isScheduled());<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      assertTrue(chore2_group2.isScheduled());<a name="line.732"></a>
+<span class="sourceLineNo">733</span>      assertTrue(chore3_group2.isScheduled());<a name="line.733"></a>
+<span class="sourceLineNo">734</span><a name="line.734"></a>
+<span class="sourceLineNo">735</span>      stopperForGroup1.stop("test stopping group 1");<a name="line.735"></a>
+<span class="sourceLineNo">736</span>      Thread.sleep(period);<a name="line.736"></a>
+<span class="sourceLineNo">737</span>      assertFalse(chore1_group1.isScheduled());<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      assertFalse(chore2_group1.isScheduled());<a name="line.738"></a>
+<span class="sourceLineNo">739</span>      assertFalse(chore3_group1.isScheduled());<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      assertTrue(chore1_group2.isScheduled());<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      assertTrue(chore2_group2.isScheduled());<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      assertTrue(chore3_group2.isScheduled());<a name="line.742"></a>
+<span class="sourceLineNo">743</span><a name="line.743"></a>
+<span class="sourceLineNo">744</span>      stopperForGroup2.stop("test stopping group 2");<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      Thread.sleep(period);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      assertFalse(chore1_group1.isScheduled());<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      assertFalse(chore2_group1.isScheduled());<a name="line.747"></a>
+<span class="sourceLineNo">748</span>      assertFalse(chore3_group1.isScheduled());<a name="line.748"></a>
+<span class="sourceLineNo">749</span>      assertFalse(chore1_group2.isScheduled());<a name="line.749"></a>
+<span class="sourceLineNo">750</span>      assertFalse(chore2_group2.isScheduled());<a name="line.750"></a>
+<span class="sourceLineNo">751</span>      assertFalse(chore3_group2.isScheduled());<a name="line.751"></a>
+<span class="sourceLineNo">752</span>    } finally {<a name="line.752"></a>
+<span class="sourceLineNo">753</span>      shutdownService(service);<a name="line.753"></a>
+<span class="sourceLineNo">754</span>    }<a name="line.754"></a>
+<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>  @Test<a name="line.757"></a>
+<span class="sourceLineNo">758</span>  public void testShutdownCancelsScheduledChores() throws InterruptedException {<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    final int period = 100;<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    ChoreService service = new ChoreService("testShutdownCancelsScheduledChores");<a name="line.760"></a>
+<span class="sourceLineNo">761</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.761"></a>
+<span class="sourceLineNo">762</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.762"></a>
+<span class="sourceLineNo">763</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.763"></a>
+<span class="sourceLineNo">764</span><a name="line.764"></a>
+<span class="sourceLineNo">765</span>    try {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      assertTrue(successChore1.isScheduled());<a name="line.767"></a>
+<span class="sourceLineNo">768</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.768"></a>
+<span class="sourceLineNo">769</span>      assertTrue(successChore2.isScheduled());<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.770"></a>
+<span class="sourceLineNo">771</span>      assertTrue(successChore3.isScheduled());<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    } finally {<a name="line.772"></a>
+<span class="sourceLineNo">773</span>      shutdownService(service);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>    assertFalse(successChore1.isScheduled());<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    assertFalse(successChore2.isScheduled());<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    assertFalse(successChore3.isScheduled());<a name="line.778"></a>
+<span class="sourceLineNo">779</span>  }<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>  @Test<a name="line.781"></a>
+<span class="sourceLineNo">782</span>  public void testShutdownWorksWhileChoresAreExecuting() throws InterruptedException {<a name="line.782"></a>
+<span class="sourceLineNo">783</span>    final int period = 100;<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    final int sleep = 5 * period;<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    ChoreService service = new ChoreService("testShutdownWorksWhileChoresAreExecuting");<a name="line.785"></a>
+<span class="sourceLineNo">786</span>    ScheduledChore slowChore1 = new SleepingChore("sc1", period, sleep);<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    ScheduledChore slowChore2 = new SleepingChore("sc2", period, sleep);<a name="line.787"></a>
+<span class="sourceLineNo">788</span>    ScheduledChore slowChore3 = new SleepingChore("sc3", period, sleep);<a name="line.788"></a>
+<span class="sourceLineNo">789</span>    try {<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      assertTrue(service.scheduleChore(slowChore1));<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      assertTrue(service.scheduleChore(slowChore2));<a name="line.791"></a>
+<span class="sourceLineNo">792</span>      assertTrue(service.scheduleChore(slowChore3));<a name="line.792"></a>
+<span class="sourceLineNo">793</span><a name="line.793"></a>
+<span class="sourceLineNo">794</span>      Thread.sleep(sleep / 2);<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      shutdownService(service);<a name="line.795"></a>
+<span class="sourceLineNo">796</span><a name="line.796"></a>
+<span class="sourceLineNo">797</span>      assertFalse(slowChore1.isScheduled());<a name="line.797"></a>
+<span class="sourceLineNo">798</span>      assertFalse(slowChore2.isScheduled());<a name="line.798"></a>
+<span class="sourceLineNo">799</span>      assertFalse(slowChore3.isScheduled());<a name="line.799"></a>
+<span class="sourceLineNo">800</span>      assertTrue(service.isShutdown());<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>      Thread.sleep(5);<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      assertTrue(service.isTerminated());<a name="line.803"></a>
+<span class="sourceLineNo">804</span>    } finally {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>      shutdownService(service);<a name="line.805"></a>
+<span class="sourceLineNo">806</span>    }<a name="line.806"></a>
+<span class="sourceLineNo">807</span>  }<a name="line.807"></a>
+<span class="sourceLineNo">808</span><a name="line.808"></a>
+<span class="sourceLineNo">809</span>  @Test<a name="line.809"></a>
+<span class="sourceLineNo">810</span>  public void testShutdownRejectsNewSchedules() throws InterruptedException {<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    final int period = 100;<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    ChoreService service = new ChoreService("testShutdownRejectsNewSchedules");<a name="line.812"></a>
+<span class="sourceLineNo">813</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    ScheduledChore failChore1 = new DoNothingChore("fc1", period);<a name="line.816"></a>
+<span class="sourceLineNo">817</span>    ScheduledChore failChore2 = new DoNothingChore("fc2", period);<a name="line.817"></a>
+<span class="sourceLineNo">818</span>    ScheduledChore failChore3 = new DoNothingChore("fc3", period);<a name="line.818"></a>
+<span class="sourceLineNo">819</span><a name="line.819"></a>
+<span class="sourceLineNo">820</span>    try {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      assertTrue(successChore1.isScheduled());<a name="line.822"></a>
+<span class="sourceLineNo">823</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.823"></a>
+<span class="sourceLineNo">824</span>      assertTrue(successChore2.isScheduled());<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      assertTrue(successChore3.isScheduled());<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    } finally {<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      shutdownService(service);<a name="line.828"></a>
+<span class="sourceLineNo">829</span>    }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>    assertFalse(service.scheduleChore(failChore1));<a name="line.831"></a>
+<span class="sourceLineNo">832</span>    assertFalse(failChore1.isScheduled());<a name="line.832"></a>
+<span class="sourceLineNo">833</span>    assertFalse(service.scheduleChore(failChore2));<a name="line.833"></a>
+<span class="sourceLineNo">834</span>    assertFalse(failChore2.isScheduled());<a name="line.834"></a>
+<span class="sourceLineNo">835</span>    assertFalse(service.scheduleChore(failChore3));<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    assertFalse(failChore3.isScheduled());<a name="line.836"></a>
+<span class="sourceLineNo">837</span>  }<a name="line.837"></a>
+<span class="sourceLineNo">838</span>}<a name="line.838"></a>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.html
index 139ba2f..4fa763e 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/TestChoreService.html
@@ -362,17 +362,17 @@
 <span class="sourceLineNo">354</span>  public void testFrequencyOfChores() throws InterruptedException {<a name="line.354"></a>
 <span class="sourceLineNo">355</span>    final int period = 100;<a name="line.355"></a>
 <span class="sourceLineNo">356</span>    // Small delta that acts as time buffer (allowing chores to complete if running slowly)<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    final int delta = 5;<a name="line.357"></a>
+<span class="sourceLineNo">357</span>    final int delta = period/5;<a name="line.357"></a>
 <span class="sourceLineNo">358</span>    ChoreService service = new ChoreService("testFrequencyOfChores");<a name="line.358"></a>
 <span class="sourceLineNo">359</span>    CountingChore chore = new CountingChore("countingChore", period);<a name="line.359"></a>
 <span class="sourceLineNo">360</span>    try {<a name="line.360"></a>
 <span class="sourceLineNo">361</span>      service.scheduleChore(chore);<a name="line.361"></a>
 <span class="sourceLineNo">362</span><a name="line.362"></a>
 <span class="sourceLineNo">363</span>      Thread.sleep(10 * period + delta);<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      assertTrue(chore.getCountOfChoreCalls() == 11);<a name="line.364"></a>
+<span class="sourceLineNo">364</span>      assertEquals("10 periods have elapsed.", 11, chore.getCountOfChoreCalls());<a name="line.364"></a>
 <span class="sourceLineNo">365</span><a name="line.365"></a>
-<span class="sourceLineNo">366</span>      Thread.sleep(10 * period);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      assertTrue(chore.getCountOfChoreCalls() == 21);<a name="line.367"></a>
+<span class="sourceLineNo">366</span>      Thread.sleep(10 * period + delta);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      assertEquals("20 periods have elapsed.", 21, chore.getCountOfChoreCalls());<a name="line.367"></a>
 <span class="sourceLineNo">368</span>    } finally {<a name="line.368"></a>
 <span class="sourceLineNo">369</span>      shutdownService(service);<a name="line.369"></a>
 <span class="sourceLineNo">370</span>    }<a name="line.370"></a>
@@ -388,14 +388,14 @@
 <span class="sourceLineNo">380</span>  @Test<a name="line.380"></a>
 <span class="sourceLineNo">381</span>  public void testForceTrigger() throws InterruptedException {<a name="line.381"></a>
 <span class="sourceLineNo">382</span>    final int period = 100;<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    final int delta = 10;<a name="line.383"></a>
+<span class="sourceLineNo">383</span>    final int delta = period/10;<a name="line.383"></a>
 <span class="sourceLineNo">384</span>    ChoreService service = new ChoreService("testForceTrigger");<a name="line.384"></a>
 <span class="sourceLineNo">385</span>    final CountingChore chore = new CountingChore("countingChore", period);<a name="line.385"></a>
 <span class="sourceLineNo">386</span>    try {<a name="line.386"></a>
 <span class="sourceLineNo">387</span>      service.scheduleChore(chore);<a name="line.387"></a>
 <span class="sourceLineNo">388</span>      Thread.sleep(10 * period + delta);<a name="line.388"></a>
 <span class="sourceLineNo">389</span><a name="line.389"></a>
-<span class="sourceLineNo">390</span>      assertTrue(chore.getCountOfChoreCalls() == 11);<a name="line.390"></a>
+<span class="sourceLineNo">390</span>      assertEquals("10 periods have elapsed.", 11, chore.getCountOfChoreCalls());<a name="line.390"></a>
 <span class="sourceLineNo">391</span><a name="line.391"></a>
 <span class="sourceLineNo">392</span>      // Force five runs of the chore to occur, sleeping between triggers to ensure the<a name="line.392"></a>
 <span class="sourceLineNo">393</span>      // chore has time to run<a name="line.393"></a>
@@ -410,438 +410,440 @@
 <span class="sourceLineNo">402</span>      chore.triggerNow();<a name="line.402"></a>
 <span class="sourceLineNo">403</span>      Thread.sleep(delta);<a name="line.403"></a>
 <span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>      assertTrue("" + chore.getCountOfChoreCalls(), chore.getCountOfChoreCalls() == 16);<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>      Thread.sleep(10 * period + delta);<a name="line.407"></a>
-<span class="sourceLineNo">408</span><a name="line.408"></a>
-<span class="sourceLineNo">409</span>      // Be loosey-goosey. It used to be '26' but it was a big flakey relying on timing.<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      assertTrue("" + chore.getCountOfChoreCalls(), chore.getCountOfChoreCalls() &gt; 16);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    } finally {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      shutdownService(service);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  @Test<a name="line.416"></a>
-<span class="sourceLineNo">417</span>  public void testCorePoolIncrease() throws InterruptedException {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    final int initialCorePoolSize = 3;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    ChoreService service = new ChoreService("testCorePoolIncrease", initialCorePoolSize, false);<a name="line.419"></a>
-<span class="sourceLineNo">420</span><a name="line.420"></a>
-<span class="sourceLineNo">421</span>    try {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      assertEquals("Should have a core pool of size: " + initialCorePoolSize, initialCorePoolSize,<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        service.getCorePoolSize());<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>      final int slowChorePeriod = 100;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      SlowChore slowChore1 = new SlowChore("slowChore1", slowChorePeriod);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      SlowChore slowChore2 = new SlowChore("slowChore2", slowChorePeriod);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      SlowChore slowChore3 = new SlowChore("slowChore3", slowChorePeriod);<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>      service.scheduleChore(slowChore1);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      service.scheduleChore(slowChore2);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      service.scheduleChore(slowChore3);<a name="line.432"></a>
-<span class="sourceLineNo">433</span><a name="line.433"></a>
-<span class="sourceLineNo">434</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      assertEquals("Should not create more pools than scheduled chores", 3,<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        service.getCorePoolSize());<a name="line.436"></a>
-<span class="sourceLineNo">437</span><a name="line.437"></a>
-<span class="sourceLineNo">438</span>      SlowChore slowChore4 = new SlowChore("slowChore4", slowChorePeriod);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      service.scheduleChore(slowChore4);<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 4,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        service.getCorePoolSize());<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>      SlowChore slowChore5 = new SlowChore("slowChore5", slowChorePeriod);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      service.scheduleChore(slowChore5);<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 5,<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        service.getCorePoolSize());<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    } finally {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      shutdownService(service);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
-<span class="sourceLineNo">455</span><a name="line.455"></a>
-<span class="sourceLineNo">456</span>  @Test<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  public void testCorePoolDecrease() throws InterruptedException {<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    final int initialCorePoolSize = 3;<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    ChoreService service = new ChoreService("testCorePoolDecrease", initialCorePoolSize, false);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    final int chorePeriod = 100;<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    try {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      // Slow chores always miss their start time and thus the core pool size should be at least as<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      // large as the number of running slow chores<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      SlowChore slowChore1 = new SlowChore("slowChore1", chorePeriod);<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      SlowChore slowChore2 = new SlowChore("slowChore2", chorePeriod);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      SlowChore slowChore3 = new SlowChore("slowChore3", chorePeriod);<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>      service.scheduleChore(slowChore1);<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      service.scheduleChore(slowChore2);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      service.scheduleChore(slowChore3);<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>      Thread.sleep(chorePeriod * 10);<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      assertEquals("Should not create more pools than scheduled chores",<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.474"></a>
-<span class="sourceLineNo">475</span><a name="line.475"></a>
-<span class="sourceLineNo">476</span>      SlowChore slowChore4 = new SlowChore("slowChore4", chorePeriod);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      service.scheduleChore(slowChore4);<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      Thread.sleep(chorePeriod * 10);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>      SlowChore slowChore5 = new SlowChore("slowChore5", chorePeriod);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      service.scheduleChore(slowChore5);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      Thread.sleep(chorePeriod * 10);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.485"></a>
-<span class="sourceLineNo">486</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.487"></a>
-<span class="sourceLineNo">488</span><a name="line.488"></a>
-<span class="sourceLineNo">489</span>      // Now we begin to cancel the chores that caused an increase in the core thread pool of the<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      // ChoreService. These cancellations should cause a decrease in the core thread pool.<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      slowChore5.cancel();<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      Thread.sleep(chorePeriod * 10);<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        service.getCorePoolSize());<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>      slowChore4.cancel();<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      Thread.sleep(chorePeriod * 10);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        service.getCorePoolSize());<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      assertEquals(3, service.getNumberOfChoresMissingStartTime());<a name="line.501"></a>
-<span class="sourceLineNo">502</span><a name="line.502"></a>
-<span class="sourceLineNo">503</span>      slowChore3.cancel();<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      Thread.sleep(chorePeriod * 10);<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.505"></a>
-<span class="sourceLineNo">506</span>        service.getCorePoolSize());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      assertEquals(2, service.getNumberOfChoresMissingStartTime());<a name="line.507"></a>
-<span class="sourceLineNo">508</span><a name="line.508"></a>
-<span class="sourceLineNo">509</span>      slowChore2.cancel();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      Thread.sleep(chorePeriod * 10);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.511"></a>
-<span class="sourceLineNo">512</span>        service.getCorePoolSize());<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>      slowChore1.cancel();<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      Thread.sleep(chorePeriod * 10);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.517"></a>
-<span class="sourceLineNo">518</span>        service.getCorePoolSize());<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    } finally {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      shutdownService(service);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>  }<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>  @Test<a name="line.525"></a>
-<span class="sourceLineNo">526</span>  public void testNumberOfRunningChores() throws InterruptedException {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    ChoreService service = new ChoreService("testNumberOfRunningChores");<a name="line.527"></a>
-<span class="sourceLineNo">528</span><a name="line.528"></a>
-<span class="sourceLineNo">529</span>    final int period = 100;<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    final int sleepTime = 5;<a name="line.530"></a>
-<span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>    try {<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      DoNothingChore dn1 = new DoNothingChore("dn1", period);<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      DoNothingChore dn2 = new DoNothingChore("dn2", period);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      DoNothingChore dn3 = new DoNothingChore("dn3", period);<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      DoNothingChore dn4 = new DoNothingChore("dn4", period);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      DoNothingChore dn5 = new DoNothingChore("dn5", period);<a name="line.537"></a>
-<span class="sourceLineNo">538</span><a name="line.538"></a>
-<span class="sourceLineNo">539</span>      service.scheduleChore(dn1);<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      service.scheduleChore(dn2);<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      service.scheduleChore(dn3);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      service.scheduleChore(dn4);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      service.scheduleChore(dn5);<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>      Thread.sleep(sleepTime);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      assertEquals("Scheduled chore mismatch", 5, service.getNumberOfScheduledChores());<a name="line.546"></a>
-<span class="sourceLineNo">547</span><a name="line.547"></a>
-<span class="sourceLineNo">548</span>      dn1.cancel();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      Thread.sleep(sleepTime);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      assertEquals("Scheduled chore mismatch", 4, service.getNumberOfScheduledChores());<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>      dn2.cancel();<a name="line.552"></a>
-<span class="sourceLineNo">553</span>      dn3.cancel();<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      dn4.cancel();<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      Thread.sleep(sleepTime);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      assertEquals("Scheduled chore mismatch", 1, service.getNumberOfScheduledChores());<a name="line.556"></a>
-<span class="sourceLineNo">557</span><a name="line.557"></a>
-<span class="sourceLineNo">558</span>      dn5.cancel();<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      Thread.sleep(sleepTime);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      assertEquals("Scheduled chore mismatch", 0, service.getNumberOfScheduledChores());<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    } finally {<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      shutdownService(service);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    }<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  }<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>  @Test<a name="line.566"></a>
-<span class="sourceLineNo">567</span>  public void testNumberOfChoresMissingStartTime() throws InterruptedException {<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    ChoreService service = new ChoreService("testNumberOfChoresMissingStartTime");<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>    final int period = 100;<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    final int sleepTime = 5 * period;<a name="line.571"></a>
-<span class="sourceLineNo">572</span><a name="line.572"></a>
-<span class="sourceLineNo">573</span>    try {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      // ALWAYS miss their start time since their execution takes longer than their period<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.580"></a>
-<span class="sourceLineNo">581</span><a name="line.581"></a>
-<span class="sourceLineNo">582</span>      service.scheduleChore(sc1);<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      service.scheduleChore(sc2);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      service.scheduleChore(sc3);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      service.scheduleChore(sc4);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      service.scheduleChore(sc5);<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>      Thread.sleep(sleepTime);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.589"></a>
-<span class="sourceLineNo">590</span><a name="line.590"></a>
-<span class="sourceLineNo">591</span>      sc1.cancel();<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      Thread.sleep(sleepTime);<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.593"></a>
-<span class="sourceLineNo">594</span><a name="line.594"></a>
-<span class="sourceLineNo">595</span>      sc2.cancel();<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      sc3.cancel();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      sc4.cancel();<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      Thread.sleep(sleepTime);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>      sc5.cancel();<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      Thread.sleep(sleepTime);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    } finally {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      shutdownService(service);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  }<a name="line.607"></a>
-<span class="sourceLineNo">608</span><a name="line.608"></a>
-<span class="sourceLineNo">609</span>  /**<a name="line.609"></a>
-<span class="sourceLineNo">610</span>   * ChoreServices should never have a core pool size that exceeds the number of chores that have<a name="line.610"></a>
-<span class="sourceLineNo">611</span>   * been scheduled with the service. For example, if 4 ScheduledChores are scheduled with a<a name="line.611"></a>
-<span class="sourceLineNo">612</span>   * ChoreService, the number of threads in the ChoreService's core pool should never exceed 4<a name="line.612"></a>
-<span class="sourceLineNo">613</span>   */<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  @Test<a name="line.614"></a>
-<span class="sourceLineNo">615</span>  public void testMaximumChoreServiceThreads() throws InterruptedException {<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    ChoreService service = new ChoreService("testMaximumChoreServiceThreads");<a name="line.616"></a>
-<span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>    final int period = 100;<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    final int sleepTime = 5 * period;<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>    try {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.622"></a>
-<span class="sourceLineNo">623</span>      // ALWAYS miss their start time since their execution takes longer than their period.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      // Chores that miss their start time will trigger the onChoreMissedStartTime callback<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      // in the ChoreService. This callback will try to increase the number of core pool<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      // threads.<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.628"></a>
-<span class="sourceLineNo">629</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.631"></a>
-<span class="sourceLineNo">632</span><a name="line.632"></a>
-<span class="sourceLineNo">633</span>      service.scheduleChore(sc1);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      service.scheduleChore(sc2);<a name="line.634"></a>
-<span class="sourceLineNo">635</span>      service.scheduleChore(sc3);<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      service.scheduleChore(sc4);<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      service.scheduleChore(sc5);<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>      Thread.sleep(sleepTime);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>      SlowChore sc6 = new SlowChore("sc6", period);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      SlowChore sc7 = new SlowChore("sc7", period);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      SlowChore sc8 = new SlowChore("sc8", period);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      SlowChore sc9 = new SlowChore("sc9", period);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      SlowChore sc10 = new SlowChore("sc10", period);<a name="line.646"></a>
-<span class="sourceLineNo">647</span><a name="line.647"></a>
-<span class="sourceLineNo">648</span>      service.scheduleChore(sc6);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      service.scheduleChore(sc7);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      service.scheduleChore(sc8);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      service.scheduleChore(sc9);<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      service.scheduleChore(sc10);<a name="line.652"></a>
-<span class="sourceLineNo">653</span><a name="line.653"></a>
-<span class="sourceLineNo">654</span>      Thread.sleep(sleepTime);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    } finally {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      shutdownService(service);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    }<a name="line.658"></a>
-<span class="sourceLineNo">659</span>  }<a name="line.659"></a>
-<span class="sourceLineNo">660</span><a name="line.660"></a>
-<span class="sourceLineNo">661</span>  @Test<a name="line.661"></a>
-<span class="sourceLineNo">662</span>  public void testChangingChoreServices() throws InterruptedException {<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    final int period = 100;<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    final int sleepTime = 10;<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    ChoreService service1 = new ChoreService("testChangingChoreServices_1");<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    ChoreService service2 = new ChoreService("testChangingChoreServices_2");<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    ScheduledChore chore = new DoNothingChore("sample", period);<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    try {<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      assertFalse(chore.isScheduled());<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.672"></a>
-<span class="sourceLineNo">673</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.673"></a>
-<span class="sourceLineNo">674</span><a name="line.674"></a>
-<span class="sourceLineNo">675</span>      service1.scheduleChore(chore);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      Thread.sleep(sleepTime);<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      assertTrue(chore.isScheduled());<a name="line.677"></a>
-<span class="sourceLineNo">678</span>      assertTrue(service1.isChoreScheduled(chore));<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>      service2.scheduleChore(chore);<a name="line.682"></a>
-<span class="sourceLineNo">683</span>      Thread.sleep(sleepTime);<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      assertTrue(chore.isScheduled());<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      assertTrue(service2.isChoreScheduled(chore));<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.687"></a>
-<span class="sourceLineNo">688</span><a name="line.688"></a>
-<span class="sourceLineNo">689</span>      chore.cancel();<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      assertFalse(chore.isScheduled());<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    } finally {<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      shutdownService(service1);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      shutdownService(service2);<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
-<span class="sourceLineNo">698</span>  }<a name="line.698"></a>
-<span class="sourceLineNo">699</span><a name="line.699"></a>
-<span class="sourceLineNo">700</span>  @Test<a name="line.700"></a>
-<span class="sourceLineNo">701</span>  public void testStopperForScheduledChores() throws InterruptedException {<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    ChoreService service = new ChoreService("testStopperForScheduledChores");<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    Stoppable stopperForGroup1 = new SampleStopper();<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    Stoppable stopperForGroup2 = new SampleStopper();<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    final int period = 100;<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    final int delta = 10;<a name="line.706"></a>
-<span class="sourceLineNo">707</span><a name="line.707"></a>
-<span class="sourceLineNo">708</span>    try {<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      ScheduledChore chore1_group1 = new DoNothingChore("c1g1", stopperForGroup1, period);<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      ScheduledChore chore2_group1 = new DoNothingChore("c2g1", stopperForGroup1, period);<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      ScheduledChore chore3_group1 = new DoNothingChore("c3g1", stopperForGroup1, period);<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>      ScheduledChore chore1_group2 = new DoNothingChore("c1g2", stopperForGroup2, period);<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      ScheduledChore chore2_group2 = new DoNothingChore("c2g2", stopperForGroup2, period);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      ScheduledChore chore3_group2 = new DoNothingChore("c3g2", stopperForGroup2, period);<a name="line.715"></a>
-<span class="sourceLineNo">716</span><a name="line.716"></a>
-<span class="sourceLineNo">717</span>      service.scheduleChore(chore1_group1);<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      service.scheduleChore(chore2_group1);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      service.scheduleChore(chore3_group1);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      service.scheduleChore(chore1_group2);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      service.scheduleChore(chore2_group2);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      service.scheduleChore(chore3_group2);<a name="line.722"></a>
-<span class="sourceLineNo">723</span><a name="line.723"></a>
-<span class="sourceLineNo">724</span>      Thread.sleep(delta);<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      Thread.sleep(10 * period);<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      assertTrue(chore1_group1.isScheduled());<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      assertTrue(chore2_group1.isScheduled());<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      assertTrue(chore3_group1.isScheduled());<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      assertTrue(chore1_group2.isScheduled());<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      assertTrue(chore2_group2.isScheduled());<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      assertTrue(chore3_group2.isScheduled());<a name="line.731"></a>
-<span class="sourceLineNo">732</span><a name="line.732"></a>
-<span class="sourceLineNo">733</span>      stopperForGroup1.stop("test stopping group 1");<a name="line.733"></a>
-<span class="sourceLineNo">734</span>      Thread.sleep(period);<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      assertFalse(chore1_group1.isScheduled());<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      assertFalse(chore2_group1.isScheduled());<a name="line.736"></a>
-<span class="sourceLineNo">737</span>      assertFalse(chore3_group1.isScheduled());<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      assertTrue(chore1_group2.isScheduled());<a name="line.738"></a>
-<span class="sourceLineNo">739</span>      assertTrue(chore2_group2.isScheduled());<a name="line.739"></a>
-<span class="sourceLineNo">740</span>      assertTrue(chore3_group2.isScheduled());<a name="line.740"></a>
-<span class="sourceLineNo">741</span><a name="line.741"></a>
-<span class="sourceLineNo">742</span>      stopperForGroup2.stop("test stopping group 2");<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      Thread.sleep(period);<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      assertFalse(chore1_group1.isScheduled());<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      assertFalse(chore2_group1.isScheduled());<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      assertFalse(chore3_group1.isScheduled());<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      assertFalse(chore1_group2.isScheduled());<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      assertFalse(chore2_group2.isScheduled());<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      assertFalse(chore3_group2.isScheduled());<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    } finally {<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      shutdownService(service);<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    }<a name="line.752"></a>
-<span class="sourceLineNo">753</span>  }<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>  @Test<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public void testShutdownCancelsScheduledChores() throws InterruptedException {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>    final int period = 100;<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    ChoreService service = new ChoreService("testShutdownCancelsScheduledChores");<a name="line.758"></a>
-<span class="sourceLineNo">759</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.761"></a>
-<span class="sourceLineNo">762</span><a name="line.762"></a>
-<span class="sourceLineNo">763</span>    try {<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      assertTrue(successChore1.isScheduled());<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.766"></a>
-<span class="sourceLineNo">767</span>      assertTrue(successChore2.isScheduled());<a name="line.767"></a>
-<span class="sourceLineNo">768</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      assertTrue(successChore3.isScheduled());<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    } finally {<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      shutdownService(service);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    }<a name="line.772"></a>
-<span class="sourceLineNo">773</span><a name="line.773"></a>
-<span class="sourceLineNo">774</span>    assertFalse(successChore1.isScheduled());<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    assertFalse(successChore2.isScheduled());<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    assertFalse(successChore3.isScheduled());<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  @Test<a name="line.779"></a>
-<span class="sourceLineNo">780</span>  public void testShutdownWorksWhileChoresAreExecuting() throws InterruptedException {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    final int period = 100;<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    final int sleep = 5 * period;<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    ChoreService service = new ChoreService("testShutdownWorksWhileChoresAreExecuting");<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    ScheduledChore slowChore1 = new SleepingChore("sc1", period, sleep);<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    ScheduledChore slowChore2 = new SleepingChore("sc2", period, sleep);<a name="line.785"></a>
-<span class="sourceLineNo">786</span>    ScheduledChore slowChore3 = new SleepingChore("sc3", period, sleep);<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    try {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      assertTrue(service.scheduleChore(slowChore1));<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      assertTrue(service.scheduleChore(slowChore2));<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      assertTrue(service.scheduleChore(slowChore3));<a name="line.790"></a>
-<span class="sourceLineNo">791</span><a name="line.791"></a>
-<span class="sourceLineNo">792</span>      Thread.sleep(sleep / 2);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>      shutdownService(service);<a name="line.793"></a>
-<span class="sourceLineNo">794</span><a name="line.794"></a>
-<span class="sourceLineNo">795</span>      assertFalse(slowChore1.isScheduled());<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      assertFalse(slowChore2.isScheduled());<a name="line.796"></a>
-<span class="sourceLineNo">797</span>      assertFalse(slowChore3.isScheduled());<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      assertTrue(service.isShutdown());<a name="line.798"></a>
-<span class="sourceLineNo">799</span><a name="line.799"></a>
-<span class="sourceLineNo">800</span>      Thread.sleep(5);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      assertTrue(service.isTerminated());<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    } finally {<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      shutdownService(service);<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    }<a name="line.804"></a>
-<span class="sourceLineNo">805</span>  }<a name="line.805"></a>
-<span class="sourceLineNo">806</span><a name="line.806"></a>
-<span class="sourceLineNo">807</span>  @Test<a name="line.807"></a>
-<span class="sourceLineNo">808</span>  public void testShutdownRejectsNewSchedules() throws InterruptedException {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    final int period = 100;<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    ChoreService service = new ChoreService("testShutdownRejectsNewSchedules");<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    ScheduledChore failChore1 = new DoNothingChore("fc1", period);<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    ScheduledChore failChore2 = new DoNothingChore("fc2", period);<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    ScheduledChore failChore3 = new DoNothingChore("fc3", period);<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>    try {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.819"></a>
-<span class="sourceLineNo">820</span>      assertTrue(successChore1.isScheduled());<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      assertTrue(successChore2.isScheduled());<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      assertTrue(successChore3.isScheduled());<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    } finally {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      shutdownService(service);<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>    assertFalse(service.scheduleChore(failChore1));<a name="line.829"></a>
-<span class="sourceLineNo">830</span>    assertFalse(failChore1.isScheduled());<a name="line.830"></a>
-<span class="sourceLineNo">831</span>    assertFalse(service.scheduleChore(failChore2));<a name="line.831"></a>
-<span class="sourceLineNo">832</span>    assertFalse(failChore2.isScheduled());<a name="line.832"></a>
-<span class="sourceLineNo">833</span>    assertFalse(service.scheduleChore(failChore3));<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    assertFalse(failChore3.isScheduled());<a name="line.834"></a>
-<span class="sourceLineNo">835</span>  }<a name="line.835"></a>
-<span class="sourceLineNo">836</span>}<a name="line.836"></a>
+<span class="sourceLineNo">405</span>      assertEquals("Trigger was called 5 times after 10 periods.", 16,<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          chore.getCountOfChoreCalls());<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>      Thread.sleep(10 * period + delta);<a name="line.408"></a>
+<span class="sourceLineNo">409</span><a name="line.409"></a>
+<span class="sourceLineNo">410</span>      // Be loosey-goosey. It used to be '26' but it was a big flakey relying on timing.<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      assertTrue("Expected at least 16 invocations, instead got " + chore.getCountOfChoreCalls(),<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          chore.getCountOfChoreCalls() &gt; 16);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    } finally {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      shutdownService(service);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    }<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  }<a name="line.416"></a>
+<span class="sourceLineNo">417</span><a name="line.417"></a>
+<span class="sourceLineNo">418</span>  @Test<a name="line.418"></a>
+<span class="sourceLineNo">419</span>  public void testCorePoolIncrease() throws InterruptedException {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    final int initialCorePoolSize = 3;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    ChoreService service = new ChoreService("testCorePoolIncrease", initialCorePoolSize, false);<a name="line.421"></a>
+<span class="sourceLineNo">422</span><a name="line.422"></a>
+<span class="sourceLineNo">423</span>    try {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>      assertEquals("Setting core pool size gave unexpected results.", initialCorePoolSize,<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        service.getCorePoolSize());<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>      final int slowChorePeriod = 100;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      SlowChore slowChore1 = new SlowChore("slowChore1", slowChorePeriod);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      SlowChore slowChore2 = new SlowChore("slowChore2", slowChorePeriod);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>      SlowChore slowChore3 = new SlowChore("slowChore3", slowChorePeriod);<a name="line.430"></a>
+<span class="sourceLineNo">431</span><a name="line.431"></a>
+<span class="sourceLineNo">432</span>      service.scheduleChore(slowChore1);<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      service.scheduleChore(slowChore2);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      service.scheduleChore(slowChore3);<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      assertEquals("Should not create more pools than scheduled chores", 3,<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        service.getCorePoolSize());<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>      SlowChore slowChore4 = new SlowChore("slowChore4", slowChorePeriod);<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      service.scheduleChore(slowChore4);<a name="line.441"></a>
+<span class="sourceLineNo">442</span><a name="line.442"></a>
+<span class="sourceLineNo">443</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 4,<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        service.getCorePoolSize());<a name="line.445"></a>
+<span class="sourceLineNo">446</span><a name="line.446"></a>
+<span class="sourceLineNo">447</span>      SlowChore slowChore5 = new SlowChore("slowChore5", slowChorePeriod);<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      service.scheduleChore(slowChore5);<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>      Thread.sleep(slowChorePeriod * 10);<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      assertEquals("Chores are missing their start time. Should expand core pool size", 5,<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        service.getCorePoolSize());<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    } finally {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      shutdownService(service);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
+<span class="sourceLineNo">457</span><a name="line.457"></a>
+<span class="sourceLineNo">458</span>  @Test<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  public void testCorePoolDecrease() throws InterruptedException {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    final int initialCorePoolSize = 3;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    ChoreService service = new ChoreService("testCorePoolDecrease", initialCorePoolSize, false);<a name="line.461"></a>
+<span class="sourceLineNo">462</span>    final int chorePeriod = 100;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    try {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>      // Slow chores always miss their start time and thus the core pool size should be at least as<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      // large as the number of running slow chores<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      SlowChore slowChore1 = new SlowChore("slowChore1", chorePeriod);<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      SlowChore slowChore2 = new SlowChore("slowChore2", chorePeriod);<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      SlowChore slowChore3 = new SlowChore("slowChore3", chorePeriod);<a name="line.468"></a>
+<span class="sourceLineNo">469</span><a name="line.469"></a>
+<span class="sourceLineNo">470</span>      service.scheduleChore(slowChore1);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      service.scheduleChore(slowChore2);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>      service.scheduleChore(slowChore3);<a name="line.472"></a>
+<span class="sourceLineNo">473</span><a name="line.473"></a>
+<span class="sourceLineNo">474</span>      Thread.sleep(chorePeriod * 10);<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      assertEquals("Should not create more pools than scheduled chores",<a name="line.475"></a>
+<span class="sourceLineNo">476</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>      SlowChore slowChore4 = new SlowChore("slowChore4", chorePeriod);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      service.scheduleChore(slowChore4);<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      Thread.sleep(chorePeriod * 10);<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.481"></a>
+<span class="sourceLineNo">482</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.482"></a>
+<span class="sourceLineNo">483</span><a name="line.483"></a>
+<span class="sourceLineNo">484</span>      SlowChore slowChore5 = new SlowChore("slowChore5", chorePeriod);<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      service.scheduleChore(slowChore5);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>      Thread.sleep(chorePeriod * 10);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>      assertEquals("Chores are missing their start time. Should expand core pool size",<a name="line.487"></a>
+<span class="sourceLineNo">488</span>        service.getNumberOfScheduledChores(), service.getCorePoolSize());<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>      // Now we begin to cancel the chores that caused an increase in the core thread pool of the<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      // ChoreService. These cancellations should cause a decrease in the core thread pool.<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      slowChore5.cancel();<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      Thread.sleep(chorePeriod * 10);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.495"></a>
+<span class="sourceLineNo">496</span>        service.getCorePoolSize());<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.497"></a>
+<span class="sourceLineNo">498</span><a name="line.498"></a>
+<span class="sourceLineNo">499</span>      slowChore4.cancel();<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      Thread.sleep(chorePeriod * 10);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        service.getCorePoolSize());<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      assertEquals(3, service.getNumberOfChoresMissingStartTime());<a name="line.503"></a>
+<span class="sourceLineNo">504</span><a name="line.504"></a>
+<span class="sourceLineNo">505</span>      slowChore3.cancel();<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      Thread.sleep(chorePeriod * 10);<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.507"></a>
+<span class="sourceLineNo">508</span>        service.getCorePoolSize());<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      assertEquals(2, service.getNumberOfChoresMissingStartTime());<a name="line.509"></a>
+<span class="sourceLineNo">510</span><a name="line.510"></a>
+<span class="sourceLineNo">511</span>      slowChore2.cancel();<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      Thread.sleep(chorePeriod * 10);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.513"></a>
+<span class="sourceLineNo">514</span>        service.getCorePoolSize());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.515"></a>
+<span class="sourceLineNo">516</span><a name="line.516"></a>
+<span class="sourceLineNo">517</span>      slowChore1.cancel();<a name="line.517"></a>
+<span class="sourceLineNo">518</span>      Thread.sleep(chorePeriod * 10);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>      assertEquals(Math.max(ChoreService.MIN_CORE_POOL_SIZE, service.getNumberOfScheduledChores()),<a name="line.519"></a>
+<span class="sourceLineNo">520</span>        service.getCorePoolSize());<a name="line.520"></a>
+<span class="sourceLineNo">521</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    } finally {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      shutdownService(service);<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    }<a name="line.524"></a>
+<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>  @Test<a name="line.527"></a>
+<span class="sourceLineNo">528</span>  public void testNumberOfRunningChores() throws InterruptedException {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    ChoreService service = new ChoreService("testNumberOfRunningChores");<a name="line.529"></a>
+<span class="sourceLineNo">530</span><a name="line.530"></a>
+<span class="sourceLineNo">531</span>    final int period = 100;<a name="line.531"></a>
+<span class="sourceLineNo">532</span>    final int sleepTime = 5;<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>    try {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      DoNothingChore dn1 = new DoNothingChore("dn1", period);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      DoNothingChore dn2 = new DoNothingChore("dn2", period);<a name="line.536"></a>
+<span class="sourceLineNo">537</span>      DoNothingChore dn3 = new DoNothingChore("dn3", period);<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      DoNothingChore dn4 = new DoNothingChore("dn4", period);<a name="line.538"></a>
+<span class="sourceLineNo">539</span>      DoNothingChore dn5 = new DoNothingChore("dn5", period);<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>      service.scheduleChore(dn1);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      service.scheduleChore(dn2);<a name="line.542"></a>
+<span class="sourceLineNo">543</span>      service.scheduleChore(dn3);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>      service.scheduleChore(dn4);<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      service.scheduleChore(dn5);<a name="line.545"></a>
+<span class="sourceLineNo">546</span><a name="line.546"></a>
+<span class="sourceLineNo">547</span>      Thread.sleep(sleepTime);<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      assertEquals("Scheduled chore mismatch", 5, service.getNumberOfScheduledChores());<a name="line.548"></a>
+<span class="sourceLineNo">549</span><a name="line.549"></a>
+<span class="sourceLineNo">550</span>      dn1.cancel();<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      Thread.sleep(sleepTime);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      assertEquals("Scheduled chore mismatch", 4, service.getNumberOfScheduledChores());<a name="line.552"></a>
+<span class="sourceLineNo">553</span><a name="line.553"></a>
+<span class="sourceLineNo">554</span>      dn2.cancel();<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      dn3.cancel();<a name="line.555"></a>
+<span class="sourceLineNo">556</span>      dn4.cancel();<a name="line.556"></a>
+<span class="sourceLineNo">557</span>      Thread.sleep(sleepTime);<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      assertEquals("Scheduled chore mismatch", 1, service.getNumberOfScheduledChores());<a name="line.558"></a>
+<span class="sourceLineNo">559</span><a name="line.559"></a>
+<span class="sourceLineNo">560</span>      dn5.cancel();<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      Thread.sleep(sleepTime);<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      assertEquals("Scheduled chore mismatch", 0, service.getNumberOfScheduledChores());<a name="line.562"></a>
+<span class="sourceLineNo">563</span>    } finally {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      shutdownService(service);<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    }<a name="line.565"></a>
+<span class="sourceLineNo">566</span>  }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>  @Test<a name="line.568"></a>
+<span class="sourceLineNo">569</span>  public void testNumberOfChoresMissingStartTime() throws InterruptedException {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    ChoreService service = new ChoreService("testNumberOfChoresMissingStartTime");<a name="line.570"></a>
+<span class="sourceLineNo">571</span><a name="line.571"></a>
+<span class="sourceLineNo">572</span>    final int period = 100;<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    final int sleepTime = 5 * period;<a name="line.573"></a>
+<span class="sourceLineNo">574</span><a name="line.574"></a>
+<span class="sourceLineNo">575</span>    try {<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      // ALWAYS miss their start time since their execution takes longer than their period<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.578"></a>
+<span class="sourceLineNo">579</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.581"></a>
+<span class="sourceLineNo">582</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.582"></a>
+<span class="sourceLineNo">583</span><a name="line.583"></a>
+<span class="sourceLineNo">584</span>      service.scheduleChore(sc1);<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      service.scheduleChore(sc2);<a name="line.585"></a>
+<span class="sourceLineNo">586</span>      service.scheduleChore(sc3);<a name="line.586"></a>
+<span class="sourceLineNo">587</span>      service.scheduleChore(sc4);<a name="line.587"></a>
+<span class="sourceLineNo">588</span>      service.scheduleChore(sc5);<a name="line.588"></a>
+<span class="sourceLineNo">589</span><a name="line.589"></a>
+<span class="sourceLineNo">590</span>      Thread.sleep(sleepTime);<a name="line.590"></a>
+<span class="sourceLineNo">591</span>      assertEquals(5, service.getNumberOfChoresMissingStartTime());<a name="line.591"></a>
+<span class="sourceLineNo">592</span><a name="line.592"></a>
+<span class="sourceLineNo">593</span>      sc1.cancel();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>      Thread.sleep(sleepTime);<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      assertEquals(4, service.getNumberOfChoresMissingStartTime());<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>      sc2.cancel();<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      sc3.cancel();<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      sc4.cancel();<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      Thread.sleep(sleepTime);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      assertEquals(1, service.getNumberOfChoresMissingStartTime());<a name="line.601"></a>
+<span class="sourceLineNo">602</span><a name="line.602"></a>
+<span class="sourceLineNo">603</span>      sc5.cancel();<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      Thread.sleep(sleepTime);<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      assertEquals(0, service.getNumberOfChoresMissingStartTime());<a name="line.605"></a>
+<span class="sourceLineNo">606</span>    } finally {<a name="line.606"></a>
+<span class="sourceLineNo">607</span>      shutdownService(service);<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
+<span class="sourceLineNo">609</span>  }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>  /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>   * ChoreServices should never have a core pool size that exceeds the number of chores that have<a name="line.612"></a>
+<span class="sourceLineNo">613</span>   * been scheduled with the service. For example, if 4 ScheduledChores are scheduled with a<a name="line.613"></a>
+<span class="sourceLineNo">614</span>   * ChoreService, the number of threads in the ChoreService's core pool should never exceed 4<a name="line.614"></a>
+<span class="sourceLineNo">615</span>   */<a name="line.615"></a>
+<span class="sourceLineNo">616</span>  @Test<a name="line.616"></a>
+<span class="sourceLineNo">617</span>  public void testMaximumChoreServiceThreads() throws InterruptedException {<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    ChoreService service = new ChoreService("testMaximumChoreServiceThreads");<a name="line.618"></a>
+<span class="sourceLineNo">619</span><a name="line.619"></a>
+<span class="sourceLineNo">620</span>    final int period = 100;<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    final int sleepTime = 5 * period;<a name="line.621"></a>
+<span class="sourceLineNo">622</span><a name="line.622"></a>
+<span class="sourceLineNo">623</span>    try {<a name="line.623"></a>
+<span class="sourceLineNo">624</span>      // Slow chores sleep for a length of time LONGER than their period. Thus, SlowChores<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      // ALWAYS miss their start time since their execution takes longer than their period.<a name="line.625"></a>
+<span class="sourceLineNo">626</span>      // Chores that miss their start time will trigger the onChoreMissedStartTime callback<a name="line.626"></a>
+<span class="sourceLineNo">627</span>      // in the ChoreService. This callback will try to increase the number of core pool<a name="line.627"></a>
+<span class="sourceLineNo">628</span>      // threads.<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      SlowChore sc1 = new SlowChore("sc1", period);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      SlowChore sc2 = new SlowChore("sc2", period);<a name="line.630"></a>
+<span class="sourceLineNo">631</span>      SlowChore sc3 = new SlowChore("sc3", period);<a name="line.631"></a>
+<span class="sourceLineNo">632</span>      SlowChore sc4 = new SlowChore("sc4", period);<a name="line.632"></a>
+<span class="sourceLineNo">633</span>      SlowChore sc5 = new SlowChore("sc5", period);<a name="line.633"></a>
+<span class="sourceLineNo">634</span><a name="line.634"></a>
+<span class="sourceLineNo">635</span>      service.scheduleChore(sc1);<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      service.scheduleChore(sc2);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      service.scheduleChore(sc3);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>      service.scheduleChore(sc4);<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      service.scheduleChore(sc5);<a name="line.639"></a>
+<span class="sourceLineNo">640</span><a name="line.640"></a>
+<span class="sourceLineNo">641</span>      Thread.sleep(sleepTime);<a name="line.641"></a>
+<span class="sourceLineNo">642</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>      SlowChore sc6 = new SlowChore("sc6", period);<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      SlowChore sc7 = new SlowChore("sc7", period);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>      SlowChore sc8 = new SlowChore("sc8", period);<a name="line.646"></a>
+<span class="sourceLineNo">647</span>      SlowChore sc9 = new SlowChore("sc9", period);<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      SlowChore sc10 = new SlowChore("sc10", period);<a name="line.648"></a>
+<span class="sourceLineNo">649</span><a name="line.649"></a>
+<span class="sourceLineNo">650</span>      service.scheduleChore(sc6);<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      service.scheduleChore(sc7);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      service.scheduleChore(sc8);<a name="line.652"></a>
+<span class="sourceLineNo">653</span>      service.scheduleChore(sc9);<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      service.scheduleChore(sc10);<a name="line.654"></a>
+<span class="sourceLineNo">655</span><a name="line.655"></a>
+<span class="sourceLineNo">656</span>      Thread.sleep(sleepTime);<a name="line.656"></a>
+<span class="sourceLineNo">657</span>      assertTrue(service.getCorePoolSize() &lt;= service.getNumberOfScheduledChores());<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    } finally {<a name="line.658"></a>
+<span class="sourceLineNo">659</span>      shutdownService(service);<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    }<a name="line.660"></a>
+<span class="sourceLineNo">661</span>  }<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>  @Test<a name="line.663"></a>
+<span class="sourceLineNo">664</span>  public void testChangingChoreServices() throws InterruptedException {<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    final int period = 100;<a name="line.665"></a>
+<span class="sourceLineNo">666</span>    final int sleepTime = 10;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    ChoreService service1 = new ChoreService("testChangingChoreServices_1");<a name="line.667"></a>
+<span class="sourceLineNo">668</span>    ChoreService service2 = new ChoreService("testChangingChoreServices_2");<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    ScheduledChore chore = new DoNothingChore("sample", period);<a name="line.669"></a>
+<span class="sourceLineNo">670</span><a name="line.670"></a>
+<span class="sourceLineNo">671</span>    try {<a name="line.671"></a>
+<span class="sourceLineNo">672</span>      assertFalse(chore.isScheduled());<a name="line.672"></a>
+<span class="sourceLineNo">673</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>      service1.scheduleChore(chore);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>      Thread.sleep(sleepTime);<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      assertTrue(chore.isScheduled());<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      assertTrue(service1.isChoreScheduled(chore));<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.682"></a>
+<span class="sourceLineNo">683</span><a name="line.683"></a>
+<span class="sourceLineNo">684</span>      service2.scheduleChore(chore);<a name="line.684"></a>
+<span class="sourceLineNo">685</span>      Thread.sleep(sleepTime);<a name="line.685"></a>
+<span class="sourceLineNo">686</span>      assertTrue(chore.isScheduled());<a name="line.686"></a>
+<span class="sourceLineNo">687</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.687"></a>
+<span class="sourceLineNo">688</span>      assertTrue(service2.isChoreScheduled(chore));<a name="line.688"></a>
+<span class="sourceLineNo">689</span>      assertFalse(chore.getChoreServicer() == null);<a name="line.689"></a>
+<span class="sourceLineNo">690</span><a name="line.690"></a>
+<span class="sourceLineNo">691</span>      chore.cancel();<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      assertFalse(chore.isScheduled());<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      assertFalse(service1.isChoreScheduled(chore));<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      assertFalse(service2.isChoreScheduled(chore));<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      assertTrue(chore.getChoreServicer() == null);<a name="line.695"></a>
+<span class="sourceLineNo">696</span>    } finally {<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      shutdownService(service1);<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      shutdownService(service2);<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    }<a name="line.699"></a>
+<span class="sourceLineNo">700</span>  }<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>  @Test<a name="line.702"></a>
+<span class="sourceLineNo">703</span>  public void testStopperForScheduledChores() throws InterruptedException {<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    ChoreService service = new ChoreService("testStopperForScheduledChores");<a name="line.704"></a>
+<span class="sourceLineNo">705</span>    Stoppable stopperForGroup1 = new SampleStopper();<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    Stoppable stopperForGroup2 = new SampleStopper();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    final int period = 100;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    final int delta = period/10;<a name="line.708"></a>
+<span class="sourceLineNo">709</span><a name="line.709"></a>
+<span class="sourceLineNo">710</span>    try {<a name="line.710"></a>
+<span class="sourceLineNo">711</span>      ScheduledChore chore1_group1 = new DoNothingChore("c1g1", stopperForGroup1, period);<a name="line.711"></a>
+<span class="sourceLineNo">712</span>      ScheduledChore chore2_group1 = new DoNothingChore("c2g1", stopperForGroup1, period);<a name="line.712"></a>
+<span class="sourceLineNo">713</span>      ScheduledChore chore3_group1 = new DoNothingChore("c3g1", stopperForGroup1, period);<a name="line.713"></a>
+<span class="sourceLineNo">714</span><a name="line.714"></a>
+<span class="sourceLineNo">715</span>      ScheduledChore chore1_group2 = new DoNothingChore("c1g2", stopperForGroup2, period);<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      ScheduledChore chore2_group2 = new DoNothingChore("c2g2", stopperForGroup2, period);<a name="line.716"></a>
+<span class="sourceLineNo">717</span>      ScheduledChore chore3_group2 = new DoNothingChore("c3g2", stopperForGroup2, period);<a name="line.717"></a>
+<span class="sourceLineNo">718</span><a name="line.718"></a>
+<span class="sourceLineNo">719</span>      service.scheduleChore(chore1_group1);<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      service.scheduleChore(chore2_group1);<a name="line.720"></a>
+<span class="sourceLineNo">721</span>      service.scheduleChore(chore3_group1);<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      service.scheduleChore(chore1_group2);<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      service.scheduleChore(chore2_group2);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      service.scheduleChore(chore3_group2);<a name="line.724"></a>
+<span class="sourceLineNo">725</span><a name="line.725"></a>
+<span class="sourceLineNo">726</span>      Thread.sleep(delta);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      Thread.sleep(10 * period);<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      assertTrue(chore1_group1.isScheduled());<a name="line.728"></a>
+<span class="sourceLineNo">729</span>      assertTrue(chore2_group1.isScheduled());<a name="line.729"></a>
+<span class="sourceLineNo">730</span>      assertTrue(chore3_group1.isScheduled());<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      assertTrue(chore1_group2.isScheduled());<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      assertTrue(chore2_group2.isScheduled());<a name="line.732"></a>
+<span class="sourceLineNo">733</span>      assertTrue(chore3_group2.isScheduled());<a name="line.733"></a>
+<span class="sourceLineNo">734</span><a name="line.734"></a>
+<span class="sourceLineNo">735</span>      stopperForGroup1.stop("test stopping group 1");<a name="line.735"></a>
+<span class="sourceLineNo">736</span>      Thread.sleep(period);<a name="line.736"></a>
+<span class="sourceLineNo">737</span>      assertFalse(chore1_group1.isScheduled());<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      assertFalse(chore2_group1.isScheduled());<a name="line.738"></a>
+<span class="sourceLineNo">739</span>      assertFalse(chore3_group1.isScheduled());<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      assertTrue(chore1_group2.isScheduled());<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      assertTrue(chore2_group2.isScheduled());<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      assertTrue(chore3_group2.isScheduled());<a name="line.742"></a>
+<span class="sourceLineNo">743</span><a name="line.743"></a>
+<span class="sourceLineNo">744</span>      stopperForGroup2.stop("test stopping group 2");<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      Thread.sleep(period);<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      assertFalse(chore1_group1.isScheduled());<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      assertFalse(chore2_group1.isScheduled());<a name="line.747"></a>
+<span class="sourceLineNo">748</span>      assertFalse(chore3_group1.isScheduled());<a name="line.748"></a>
+<span class="sourceLineNo">749</span>      assertFalse(chore1_group2.isScheduled());<a name="line.749"></a>
+<span class="sourceLineNo">750</span>      assertFalse(chore2_group2.isScheduled());<a name="line.750"></a>
+<span class="sourceLineNo">751</span>      assertFalse(chore3_group2.isScheduled());<a name="line.751"></a>
+<span class="sourceLineNo">752</span>    } finally {<a name="line.752"></a>
+<span class="sourceLineNo">753</span>      shutdownService(service);<a name="line.753"></a>
+<span class="sourceLineNo">754</span>    }<a name="line.754"></a>
+<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
+<span class="sourceLineNo">756</span><a name="line.756"></a>
+<span class="sourceLineNo">757</span>  @Test<a name="line.757"></a>
+<span class="sourceLineNo">758</span>  public void testShutdownCancelsScheduledChores() throws InterruptedException {<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    final int period = 100;<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    ChoreService service = new ChoreService("testShutdownCancelsScheduledChores");<a name="line.760"></a>
+<span class="sourceLineNo">761</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.761"></a>
+<span class="sourceLineNo">762</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.762"></a>
+<span class="sourceLineNo">763</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.763"></a>
+<span class="sourceLineNo">764</span><a name="line.764"></a>
+<span class="sourceLineNo">765</span>    try {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      assertTrue(successChore1.isScheduled());<a name="line.767"></a>
+<span class="sourceLineNo">768</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.768"></a>
+<span class="sourceLineNo">769</span>      assertTrue(successChore2.isScheduled());<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.770"></a>
+<span class="sourceLineNo">771</span>      assertTrue(successChore3.isScheduled());<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    } finally {<a name="line.772"></a>
+<span class="sourceLineNo">773</span>      shutdownService(service);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>    }<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>    assertFalse(successChore1.isScheduled());<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    assertFalse(successChore2.isScheduled());<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    assertFalse(successChore3.isScheduled());<a name="line.778"></a>
+<span class="sourceLineNo">779</span>  }<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>  @Test<a name="line.781"></a>
+<span class="sourceLineNo">782</span>  public void testShutdownWorksWhileChoresAreExecuting() throws InterruptedException {<a name="line.782"></a>
+<span class="sourceLineNo">783</span>    final int period = 100;<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    final int sleep = 5 * period;<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    ChoreService service = new ChoreService("testShutdownWorksWhileChoresAreExecuting");<a name="line.785"></a>
+<span class="sourceLineNo">786</span>    ScheduledChore slowChore1 = new SleepingChore("sc1", period, sleep);<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    ScheduledChore slowChore2 = new SleepingChore("sc2", period, sleep);<a name="line.787"></a>
+<span class="sourceLineNo">788</span>    ScheduledChore slowChore3 = new SleepingChore("sc3", period, sleep);<a name="line.788"></a>
+<span class="sourceLineNo">789</span>    try {<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      assertTrue(service.scheduleChore(slowChore1));<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      assertTrue(service.scheduleChore(slowChore2));<a name="line.791"></a>
+<span class="sourceLineNo">792</span>      assertTrue(service.scheduleChore(slowChore3));<a name="line.792"></a>
+<span class="sourceLineNo">793</span><a name="line.793"></a>
+<span class="sourceLineNo">794</span>      Thread.sleep(sleep / 2);<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      shutdownService(service);<a name="line.795"></a>
+<span class="sourceLineNo">796</span><a name="line.796"></a>
+<span class="sourceLineNo">797</span>      assertFalse(slowChore1.isScheduled());<a name="line.797"></a>
+<span class="sourceLineNo">798</span>      assertFalse(slowChore2.isScheduled());<a name="line.798"></a>
+<span class="sourceLineNo">799</span>      assertFalse(slowChore3.isScheduled());<a name="line.799"></a>
+<span class="sourceLineNo">800</span>      assertTrue(service.isShutdown());<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>      Thread.sleep(5);<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      assertTrue(service.isTerminated());<a name="line.803"></a>
+<span class="sourceLineNo">804</span>    } finally {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>      shutdownService(service);<a name="line.805"></a>
+<span class="sourceLineNo">806</span>    }<a name="line.806"></a>
+<span class="sourceLineNo">807</span>  }<a name="line.807"></a>
+<span class="sourceLineNo">808</span><a name="line.808"></a>
+<span class="sourceLineNo">809</span>  @Test<a name="line.809"></a>
+<span class="sourceLineNo">810</span>  public void testShutdownRejectsNewSchedules() throws InterruptedException {<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    final int period = 100;<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    ChoreService service = new ChoreService("testShutdownRejectsNewSchedules");<a name="line.812"></a>
+<span class="sourceLineNo">813</span>    ScheduledChore successChore1 = new DoNothingChore("sc1", period);<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    ScheduledChore successChore2 = new DoNothingChore("sc2", period);<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    ScheduledChore successChore3 = new DoNothingChore("sc3", period);<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    ScheduledChore failChore1 = new DoNothingChore("fc1", period);<a name="line.816"></a>
+<span class="sourceLineNo">817</span>    ScheduledChore failChore2 = new DoNothingChore("fc2", period);<a name="line.817"></a>
+<span class="sourceLineNo">818</span>    ScheduledChore failChore3 = new DoNothingChore("fc3", period);<a name="line.818"></a>
+<span class="sourceLineNo">819</span><a name="line.819"></a>
+<span class="sourceLineNo">820</span>    try {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      assertTrue(service.scheduleChore(successChore1));<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      assertTrue(successChore1.isScheduled());<a name="line.822"></a>
+<span class="sourceLineNo">823</span>      assertTrue(service.scheduleChore(successChore2));<a name="line.823"></a>
+<span class="sourceLineNo">824</span>      assertTrue(successChore2.isScheduled());<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      assertTrue(service.scheduleChore(successChore3));<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      assertTrue(successChore3.isScheduled());<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    } finally {<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      shutdownService(service);<a name="line.828"></a>
+<span class="sourceLineNo">829</span>    }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>    assertFalse(service.scheduleChore(failChore1));<a name="line.831"></a>
+<span class="sourceLineNo">832</span>    assertFalse(failChore1.isScheduled());<a name="line.832"></a>
+<span class="sourceLineNo">833</span>    assertFalse(service.scheduleChore(failChore2));<a name="line.833"></a>
+<span class="sourceLineNo">834</span>    assertFalse(failChore2.isScheduled());<a name="line.834"></a>
+<span class="sourceLineNo">835</span>    assertFalse(service.scheduleChore(failChore3));<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    assertFalse(failChore3.isScheduled());<a name="line.836"></a>
+<span class="sourceLineNo">837</span>  }<a name="line.837"></a>
+<span class="sourceLineNo">838</span>}<a name="line.838"></a>