--- jsr166/src/jsr166y/ForkJoinPool.java 2009/07/25 00:34:00 1.22 +++ jsr166/src/jsr166y/ForkJoinPool.java 2009/07/25 15:50:57 1.23 @@ -548,6 +548,8 @@ public class ForkJoinPool extends Abstra * Common code for execute, invoke and submit */ private void doSubmit(ForkJoinTask task) { + if (task == null) + throw new NullPointerException(); if (isShutdown()) throw new RejectedExecutionException(); if (workers == null) @@ -583,7 +585,14 @@ public class ForkJoinPool extends Abstra // AbstractExecutorService methods public void execute(Runnable task) { - doSubmit(new AdaptedRunnable(task, null)); + ForkJoinTask job; + if (task instanceof AdaptedCallable) // avoid re-wrap + job = (AdaptedCallable)task; + else if (task instanceof AdaptedRunnable) + job = (AdaptedRunnable)task; + else + job = new AdaptedRunnable(task, null); + doSubmit(job); } public ForkJoinTask submit(Callable task) { @@ -599,12 +608,32 @@ public class ForkJoinPool extends Abstra } public ForkJoinTask submit(Runnable task) { - ForkJoinTask job = new AdaptedRunnable(task, null); + ForkJoinTask job; + if (task instanceof AdaptedCallable) // avoid re-wrap + job = (AdaptedCallable)task; + else if (task instanceof AdaptedRunnable) + job = (AdaptedRunnable)task; + else + job = new AdaptedRunnable(task, null); doSubmit(job); return job; } /** + * Submits a ForkJoinTask for execution. + * + * @param task the task to submit + * @return the task + * @throws RejectedExecutionException if the task cannot be + * scheduled for execution + * @throws NullPointerException if the task is null + */ + public ForkJoinTask submit(ForkJoinTask task) { + doSubmit(task); + return task; + } + + /** * Adaptor for Runnables. This implements RunnableFuture * to be compliant with AbstractExecutorService constraints. */