|
|
@@ -11,6 +11,31 @@ |
|
|
|
<h3>Description</h3> |
|
|
|
<p>Parallel is a container task - it can contain other Ant tasks. Each nested |
|
|
|
task within the parallel task will be executed in its own thread. </p> |
|
|
|
<h3>Parameters</h3> |
|
|
|
<table border="1" cellpadding="2" cellspacing="0"> |
|
|
|
<tr> |
|
|
|
<td valign="top"><b>Attribute</b></td> |
|
|
|
<td valign="top"><b>Description</b></td> |
|
|
|
<td align="center" valign="top"><b>Required</b></td> |
|
|
|
</tr> |
|
|
|
<tr> |
|
|
|
<td valign="top">threadCount</td> |
|
|
|
<td valign="top">Maximum numbers of thread to use.</td> |
|
|
|
<td align="center" valign="top">No</td> |
|
|
|
</tr> |
|
|
|
<tr> |
|
|
|
<td valign="top">threadsPerProcessor</td> |
|
|
|
<td valign="top">Maximum number of threads to use per available processor |
|
|
|
(Requires JDK 1.4)</td> |
|
|
|
<td align="center" valign="top">No, defers to threadCount</td> |
|
|
|
</tr> |
|
|
|
<tr> |
|
|
|
<td valign="top">pollInterval</td> |
|
|
|
<td valign="top">Maximum number of milliseconds to wait for before checking |
|
|
|
when waiting for available threads.</td> |
|
|
|
<td align="center" valign="top">No, default is 1000</td> |
|
|
|
</tr> |
|
|
|
</table> |
|
|
|
|
|
|
|
<p>Parallel tasks have a number of uses in an Ant build file including:</p> |
|
|
|
<ul> |
|
|
@@ -41,6 +66,26 @@ In this situation, the parallel task will also fail.</p> |
|
|
|
sequential</a> task to define sequences of tasks to be executed on each thread |
|
|
|
within the parallel block</p> |
|
|
|
|
|
|
|
<p>The threadCount attribute can be used to place a maximum number of available |
|
|
|
threads for the execution. When not present all child tasks will be executed at |
|
|
|
once. When present then the maximum number of concurrently executing tasks will |
|
|
|
not exceed the number of threads specified. Furthermore, each task will be |
|
|
|
started in the order they are given. But no guarantee is made as to the speed |
|
|
|
of execution or the order of completion of the tasks, only that each will be |
|
|
|
started before the next.<p> |
|
|
|
|
|
|
|
<p>If you are using J2RE 1.4 or later you can also use the threadsPerProcessor |
|
|
|
and the number of available threads will be the stated multiple of the number of |
|
|
|
processors (there is no affinity to a particular processor however). This will |
|
|
|
override the value in threadCount. If threadsPerProcessor is specified using |
|
|
|
any version prior to 1.4 then the value in threadCount will be used as is.</p> |
|
|
|
|
|
|
|
<p>When using threadCount and threadsPerProcessor care should be taken to insure |
|
|
|
that the build does not deadlock. This can be caused by tasks such as waitFor |
|
|
|
takeing up all available threads before the tasks that would unlock the waitfor |
|
|
|
would occur. This is not a repalcement for Java Language level thread |
|
|
|
semantics and is best used for "embarasingly parallel" tasks.</p> |
|
|
|
|
|
|
|
<h3>Examples</h3> |
|
|
|
<pre> |
|
|
|
<parallel> |
|
|
@@ -75,6 +120,31 @@ compiled in one thead and a set of JSPs is being precompiled in another. As |
|
|
|
noted above, you need to be careful that the two tasks are independent, both in |
|
|
|
terms of their dependencies and in terms of their potential interactions in |
|
|
|
Ant's external environment.</p> |
|
|
|
|
|
|
|
<pre> |
|
|
|
<parallel threadCount='4'> |
|
|
|
<ant target='TargetThatConsumesLotsOfCPUTimeAndMemory'> |
|
|
|
<param name='file' value='one.txt'/> |
|
|
|
</ant> |
|
|
|
<ant target='TargetThatConsumesLotsOfCPUTimeAndMemory'> |
|
|
|
<param name='file' value='two.txt'/> |
|
|
|
</ant> |
|
|
|
<ant target='TargetThatConsumesLotsOfCPUTimeAndMemory'> |
|
|
|
<param name='file' value='three.txt'/> |
|
|
|
</ant> |
|
|
|
<!-- repeated about 40 times --> |
|
|
|
</parallel> |
|
|
|
</pre> |
|
|
|
|
|
|
|
<p>This example represents a typical need for use of the threadCount and |
|
|
|
threadsPerProcessor attributes. Spinning up all 40 of those tasks could cripple |
|
|
|
the JVM for memory and the CPU for available time. By limiting the number of |
|
|
|
concurrent executions you can get the task done in about the same assuming |
|
|
|
infinite memory time without needing infinite memory. This is also a good |
|
|
|
candidiate for use of threadCount (and possibly threadsPerProcessor) because |
|
|
|
each task (in this hypothetical case) is independent and has no dependencies on |
|
|
|
the other tasks.</p> |
|
|
|
|
|
|
|
<hr> |
|
|
|
<p align="center">Copyright © 2001-2002 Apache Software Foundation. All rights |
|
|
|
Reserved.</p> |
|
|
|