--- jsr166/src/jsr166y/ForkJoinPool.java 2009/07/30 22:05:19 1.32 +++ jsr166/src/jsr166y/ForkJoinPool.java 2009/07/31 16:27:08 1.33 @@ -589,18 +589,18 @@ public class ForkJoinPool extends Abstra if (task instanceof ForkJoinTask) // avoid re-wrap job = (ForkJoinTask) task; else - job = new AdaptedRunnable(task, null); + job = ForkJoinTask.adapt(task, null); doSubmit(job); } public ForkJoinTask submit(Callable task) { - ForkJoinTask job = new AdaptedCallable(task); + ForkJoinTask job = ForkJoinTask.adapt(task); doSubmit(job); return job; } public ForkJoinTask submit(Runnable task, T result) { - ForkJoinTask job = new AdaptedRunnable(task, result); + ForkJoinTask job = ForkJoinTask.adapt(task, result); doSubmit(job); return job; } @@ -610,7 +610,7 @@ public class ForkJoinPool extends Abstra if (task instanceof ForkJoinTask) // avoid re-wrap job = (ForkJoinTask) task; else - job = new AdaptedRunnable(task, null); + job = ForkJoinTask.adapt(task, null); doSubmit(job); return job; } @@ -629,65 +629,12 @@ public class ForkJoinPool extends Abstra return task; } - /** - * Adaptor for Runnables. This implements RunnableFuture - * to be compliant with AbstractExecutorService constraints. - */ - static final class AdaptedRunnable extends ForkJoinTask - implements RunnableFuture { - final Runnable runnable; - final T resultOnCompletion; - T result; - AdaptedRunnable(Runnable runnable, T result) { - if (runnable == null) throw new NullPointerException(); - this.runnable = runnable; - this.resultOnCompletion = result; - } - public T getRawResult() { return result; } - public void setRawResult(T v) { result = v; } - public boolean exec() { - runnable.run(); - result = resultOnCompletion; - return true; - } - public void run() { invoke(); } - private static final long serialVersionUID = 5232453952276885070L; - } - - /** - * Adaptor for Callables - */ - static final class AdaptedCallable extends ForkJoinTask - implements RunnableFuture { - final Callable callable; - T result; - AdaptedCallable(Callable callable) { - if (callable == null) throw new NullPointerException(); - this.callable = callable; - } - public T getRawResult() { return result; } - public void setRawResult(T v) { result = v; } - public boolean exec() { - try { - result = callable.call(); - return true; - } catch (Error err) { - throw err; - } catch (RuntimeException rex) { - throw rex; - } catch (Exception ex) { - throw new RuntimeException(ex); - } - } - public void run() { invoke(); } - private static final long serialVersionUID = 2838392045355241008L; - } public List> invokeAll(Collection> tasks) { ArrayList> forkJoinTasks = new ArrayList>(tasks.size()); for (Callable task : tasks) - forkJoinTasks.add(new AdaptedCallable(task)); + forkJoinTasks.add(ForkJoinTask.adapt(task)); invoke(new InvokeAll(forkJoinTasks)); @SuppressWarnings({"unchecked", "rawtypes"}) @@ -1881,14 +1828,16 @@ public class ForkJoinPool extends Abstra do {} while (!blocker.isReleasable() && !blocker.block()); } - // AbstractExecutorService overrides + // AbstractExecutorService overrides. These rely on undocumented + // fact that ForkJoinTask.adapt returns ForkJoinTasks that also + // implement RunnableFuture. protected RunnableFuture newTaskFor(Runnable runnable, T value) { - return new AdaptedRunnable(runnable, value); + return (RunnableFuture)ForkJoinTask.adapt(runnable, value); } protected RunnableFuture newTaskFor(Callable callable) { - return new AdaptedCallable(callable); + return (RunnableFuture)ForkJoinTask.adapt(callable); } // Unsafe mechanics