If you have the executors, the builds should run in parallel. Given the following script in the Script Console (and jobs named wait1..wait4 with different durations):
---
def futures = []
[1, 2, 3, 4].each {
futures.add Jenkins.instance.getItemByFullName("wait${it}").scheduleBuild2(0)
}
futures.each {
println it.get().time
println it.get().duration // millis
}
---
The following output is printed:
---
Sun Mar 09 23:18:12 CET 2014
20025
Sun Mar 09 23:18:12 CET 2014
10031
Sun Mar 09 23:18:22 CET 2014
25027
Sun Mar 09 23:18:32 CET 2014
15026
---
I have two executors, and you can see the first two started at the same time, the third when the second was finished, the fourth when the first was finished.
Note that get() is a blocking call, and it waits for the related build to complete. That build isn't necessarily the one finishing first -- there's a chance you'll wait for the longest-running build first in the second loop, only to then get the subsequent results immediately, because they've finished long ago. Perhaps you can use Future.get(long,TimeUnit) instead if you want to present the results in the order they are available.
Another possible issue: Did you make sure that your queue does not simply collapse multiple executions of the same job into one, because they're considered equal?