| Index: lib/src/executable.dart
 | 
| diff --git a/lib/src/executable.dart b/lib/src/executable.dart
 | 
| index ebe0e7558cc56d86238a8740f0140026707e494b..65ff6f821df613fe24b28d47b13d042646e38591 100644
 | 
| --- a/lib/src/executable.dart
 | 
| +++ b/lib/src/executable.dart
 | 
| @@ -10,6 +10,7 @@ library test.executable;
 | 
|  import 'dart:async';
 | 
|  import 'dart:io';
 | 
|  import 'dart:isolate';
 | 
| +import 'dart:math' as math;
 | 
|  
 | 
|  import 'package:args/args.dart';
 | 
|  import 'package:stack_trace/stack_trace.dart';
 | 
| @@ -26,6 +27,12 @@ import 'utils.dart';
 | 
|  /// The argument parser used to parse the executable arguments.
 | 
|  final _parser = new ArgParser(allowTrailingOptions: true);
 | 
|  
 | 
| +/// The default number of test suites to run at once.
 | 
| +///
 | 
| +/// This defaults to half the available processors, since presumably some of
 | 
| +/// them will be used for the OS and other processes.
 | 
| +final _defaultConcurrency = math.max(1, Platform.numberOfProcessors ~/ 2);
 | 
| +
 | 
|  /// A merged stream of all signals that tell the test runner to shut down
 | 
|  /// gracefully.
 | 
|  ///
 | 
| @@ -80,6 +87,11 @@ void main(List<String> args) {
 | 
|        allowed: TestPlatform.all.map((platform) => platform.identifier).toList(),
 | 
|        defaultsTo: 'vm',
 | 
|        allowMultiple: true);
 | 
| +  _parser.addOption("concurrency",
 | 
| +      abbr: 'j',
 | 
| +      help: 'The number of concurrent test suites run.\n'
 | 
| +          '(defaults to $_defaultConcurrency)',
 | 
| +      valueHelp: 'threads');
 | 
|    _parser.addOption("pub-serve",
 | 
|        help: 'The port of a pub serve instance serving "test/".',
 | 
|        hide: !supportsPubServe,
 | 
| @@ -127,6 +139,18 @@ transformers:
 | 
|        packageRoot: options["package-root"],
 | 
|        color: color);
 | 
|  
 | 
| +  var concurrency = _defaultConcurrency;
 | 
| +  if (options["concurrency"] != null) {
 | 
| +    try {
 | 
| +      concurrency = int.parse(options["concurrency"]);
 | 
| +    } catch (error) {
 | 
| +      _printUsage('Couldn\'t parse --concurrency "${options["concurrency"]}":'
 | 
| +          ' ${error.message}');
 | 
| +      exitCode = exit_codes.usage;
 | 
| +      return;
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
|    var signalSubscription;
 | 
|    var closed = false;
 | 
|    signalSubscription = _signals.listen((_) {
 | 
| @@ -186,7 +210,8 @@ transformers:
 | 
|        }
 | 
|      }
 | 
|  
 | 
| -    var reporter = new CompactReporter(flatten(suites), color: color);
 | 
| +    var reporter = new CompactReporter(flatten(suites),
 | 
| +        concurrency: concurrency, color: color);
 | 
|  
 | 
|      // Override the signal handler to close [reporter]. [loader] will still be
 | 
|      // closed in the [whenComplete] below.
 | 
| @@ -197,7 +222,10 @@ transformers:
 | 
|        // Wait a bit to print this message, since printing it eagerly looks weird
 | 
|        // if the tests then finish immediately.
 | 
|        var timer = new Timer(new Duration(seconds: 1), () {
 | 
| -        print("Waiting for current test to finish.");
 | 
| +        // Print a blank line first to ensure that this doesn't interfere with
 | 
| +        // the compact reporter's unfinished line.
 | 
| +        print("");
 | 
| +        print("Waiting for current test(s) to finish.");
 | 
|          print("Press Control-C again to terminate immediately.");
 | 
|        });
 | 
|  
 | 
| 
 |