summaryrefslogtreecommitdiff
path: root/src/forkjoin
diff options
context:
space:
mode:
authorViktor Klang <viktor.klang@gmail.com>2014-09-26 12:05:37 +0200
committerViktor Klang <viktor.klang@gmail.com>2014-10-20 23:55:44 +0200
commitfa0743c32338f147eaf7a5d69566bbc15d193f85 (patch)
tree24f6b6d5cbab337174d48f0d0876ac0de93141f5 /src/forkjoin
parentc0ceffb865ff4b2146aacec547cc42bb7605ee93 (diff)
downloadscala-fa0743c32338f147eaf7a5d69566bbc15d193f85.tar.gz
scala-fa0743c32338f147eaf7a5d69566bbc15d193f85.tar.bz2
scala-fa0743c32338f147eaf7a5d69566bbc15d193f85.zip
Add missing canonical combinators:
- `def transform[S](f: Try[T] => Try[S])(implicit executor: ExecutionContext): Future[S]` - `def transformWith[S](f: Try[T] => Future[S])(implicit executor: ExecutionContext): Future[S]` - `def flatten[S](implicit ev: T <:< Future[S]): Future[S]` - `def zipWith[U, R](that: Future[U])(f: (T, U) => R)(implicit executor: ExecutionContext): Future[R]` Add missing utilities: - `val unit: Future[Unit]` in `object Future` - `object never extends Future[Nothing]` in `object Future` - `def defaultBlockContext: BlockContext` in `object BlockContext` - `def toString: String` on stdlib implementations of `Future` Refactors: - the `scala.concurrent.Future` trait to not explicit create any `Promises`, so that implementations can control implementation type, this is mainly facilitated through adding of the `transform` and `transformWith` methods. - the implementation of `ExecutionContextImpl` has been cleaned up - the `scala.concurrent.impl.DefaultPromise` has been reimplemented to not use `sun.misc.Unsafe` Securing: - Add a self-check in `completeWith` and `tryCompleteWith` to avoid cycles in trait Promise - Capping the maximum number of threads for the global `ExecutionContext` to the max parallelism - Implementing (almost) all `Future` combinators on `transformWith` and `transform` means that `DefaultPromise` linking works on both `(flat)map` and `recover(With)` - Nested `blocking {}` should not spawn extra threads beyond the first. Removes: - the private `internalExecutor` method in favor of an import in trait `Future` - the private `internalExecutor` method in favor of an import in trait `Promise` - the `AtomicReferenceFieldUpdater` in `AbstractPromise` since we're using `Unsafe` - `scala.concurrent.impl.Future` is no longer needed Deprecates: - `Future.onSuccess` - discourage the use of callbacks (and is also redundant considering `foreach` and `onComplete`) - `Future.onFailure` - discourage the use of callbacks (and is also redundant considering `onComplete` and `failed.foreach`) - `ExecutionContext.prepare` - it was ill specced and it is too easy to forget to call it (or even know when to call it or call it more times than needed) - All classes in scala.concurrent.forkjoin. Scala 2.12 will be Java 8+ and as such the jsr166e should be used as included in java.util.concurrent. Reimplements: - `failed` - in terms of `transform` - `map` - in terms of `transform` - `flatMap` - in terms of `transformWith` - `recover` - in terms of `transform` - `recoverWith` - in terms of `transformWith` - `zip` - in terms of `flatMap` + `map` - `fallbackTo` - in terms of `recoverWith` + `recoverWith` - `andThen` - in terms of `transform` Miscellaneous: - Giving the threads of `ExecutionContext.global` sensible names - Optimizes `object Future.successful` and `object Future.failed` are now separate implementations, to optimize for the result, avoiding doing work for the "other branch". - Optimizes `compressedRoot()` by avoiding double-calls to volatile get. Documentation: - Almost all methods on `Future` and `Promise` have been revisited and had their ScalaDoc updated Tests: - Yes
Diffstat (limited to 'src/forkjoin')
-rw-r--r--src/forkjoin/scala/concurrent/forkjoin/ForkJoinPool.java3
-rw-r--r--src/forkjoin/scala/concurrent/forkjoin/ForkJoinTask.java5
-rw-r--r--src/forkjoin/scala/concurrent/forkjoin/ForkJoinWorkerThread.java1
-rw-r--r--src/forkjoin/scala/concurrent/forkjoin/LinkedTransferQueue.java3
-rw-r--r--src/forkjoin/scala/concurrent/forkjoin/RecursiveAction.java1
-rw-r--r--src/forkjoin/scala/concurrent/forkjoin/RecursiveTask.java1
-rw-r--r--src/forkjoin/scala/concurrent/forkjoin/ThreadLocalRandom.java2
-rw-r--r--src/forkjoin/scala/concurrent/forkjoin/TransferQueue.java1
-rw-r--r--src/forkjoin/scala/concurrent/util/Unsafe.java6
9 files changed, 19 insertions, 4 deletions
diff --git a/src/forkjoin/scala/concurrent/forkjoin/ForkJoinPool.java b/src/forkjoin/scala/concurrent/forkjoin/ForkJoinPool.java
index 6578504155..9bd378c61c 100644
--- a/src/forkjoin/scala/concurrent/forkjoin/ForkJoinPool.java
+++ b/src/forkjoin/scala/concurrent/forkjoin/ForkJoinPool.java
@@ -23,6 +23,7 @@ import java.util.concurrent.TimeUnit;
* @since 1.8
* @author Doug Lea
*/
+@Deprecated
/*public*/ abstract class CountedCompleter<T> extends ForkJoinTask<T> {
private static final long serialVersionUID = 5232453752276485070L;
@@ -471,6 +472,7 @@ import java.util.concurrent.TimeUnit;
* @since 1.7
* @author Doug Lea
*/
+@Deprecated
public class ForkJoinPool extends AbstractExecutorService {
/*
@@ -3578,6 +3580,7 @@ public class ForkJoinPool extends AbstractExecutorService {
* }
* }}</pre>
*/
+ @Deprecated
public static interface ManagedBlocker {
/**
* Possibly blocks the current thread, for example waiting for
diff --git a/src/forkjoin/scala/concurrent/forkjoin/ForkJoinTask.java b/src/forkjoin/scala/concurrent/forkjoin/ForkJoinTask.java
index fd1e132b07..b4f5c24ca9 100644
--- a/src/forkjoin/scala/concurrent/forkjoin/ForkJoinTask.java
+++ b/src/forkjoin/scala/concurrent/forkjoin/ForkJoinTask.java
@@ -180,6 +180,7 @@ import java.lang.reflect.Constructor;
* @since 1.7
* @author Doug Lea
*/
+@Deprecated
public abstract class ForkJoinTask<V> implements Future<V>, Serializable {
/*
@@ -391,6 +392,7 @@ public abstract class ForkJoinTask<V> implements Future<V>, Serializable {
* any ForkJoinPool will call helpExpungeStaleExceptions when its
* pool becomes isQuiescent.
*/
+ @Deprecated
static final class ExceptionNode extends WeakReference<ForkJoinTask<?>> {
final Throwable ex;
ExceptionNode next;
@@ -1330,6 +1332,7 @@ public abstract class ForkJoinTask<V> implements Future<V>, Serializable {
* to be compliant with AbstractExecutorService constraints
* when used in ForkJoinPool.
*/
+ @Deprecated
static final class AdaptedRunnable<T> extends ForkJoinTask<T>
implements RunnableFuture<T> {
final Runnable runnable;
@@ -1349,6 +1352,7 @@ public abstract class ForkJoinTask<V> implements Future<V>, Serializable {
/**
* Adaptor for Runnables without results
*/
+ @Deprecated
static final class AdaptedRunnableAction extends ForkJoinTask<Void>
implements RunnableFuture<Void> {
final Runnable runnable;
@@ -1366,6 +1370,7 @@ public abstract class ForkJoinTask<V> implements Future<V>, Serializable {
/**
* Adaptor for Callables
*/
+ @Deprecated
static final class AdaptedCallable<T> extends ForkJoinTask<T>
implements RunnableFuture<T> {
final Callable<? extends T> callable;
diff --git a/src/forkjoin/scala/concurrent/forkjoin/ForkJoinWorkerThread.java b/src/forkjoin/scala/concurrent/forkjoin/ForkJoinWorkerThread.java
index e62fc6eb71..e00fb5cc43 100644
--- a/src/forkjoin/scala/concurrent/forkjoin/ForkJoinWorkerThread.java
+++ b/src/forkjoin/scala/concurrent/forkjoin/ForkJoinWorkerThread.java
@@ -20,6 +20,7 @@ package scala.concurrent.forkjoin;
* @since 1.7
* @author Doug Lea
*/
+@Deprecated
public class ForkJoinWorkerThread extends Thread {
/*
* ForkJoinWorkerThreads are managed by ForkJoinPools and perform
diff --git a/src/forkjoin/scala/concurrent/forkjoin/LinkedTransferQueue.java b/src/forkjoin/scala/concurrent/forkjoin/LinkedTransferQueue.java
index 07e81b395d..47d52af895 100644
--- a/src/forkjoin/scala/concurrent/forkjoin/LinkedTransferQueue.java
+++ b/src/forkjoin/scala/concurrent/forkjoin/LinkedTransferQueue.java
@@ -53,6 +53,7 @@ import java.util.concurrent.locks.LockSupport;
* @author Doug Lea
* @param <E> the type of elements held in this collection
*/
+@Deprecated
public class LinkedTransferQueue<E> extends AbstractQueue<E>
implements TransferQueue<E>, java.io.Serializable {
private static final long serialVersionUID = -3223113410248163686L;
@@ -416,6 +417,7 @@ public class LinkedTransferQueue<E> extends AbstractQueue<E>
* unnecessary ordering constraints: Writes that are intrinsically
* ordered wrt other accesses or CASes use simple relaxed forms.
*/
+ @Deprecated
static final class Node {
final boolean isData; // false if this is a request node
volatile Object item; // initially non-null if isData; CASed to match
@@ -789,6 +791,7 @@ public class LinkedTransferQueue<E> extends AbstractQueue<E>
return count;
}
+ @Deprecated
final class Itr implements Iterator<E> {
private Node nextNode; // next node to return item for
private E nextItem; // the corresponding item
diff --git a/src/forkjoin/scala/concurrent/forkjoin/RecursiveAction.java b/src/forkjoin/scala/concurrent/forkjoin/RecursiveAction.java
index 1e7cdd952d..f4a77f0f61 100644
--- a/src/forkjoin/scala/concurrent/forkjoin/RecursiveAction.java
+++ b/src/forkjoin/scala/concurrent/forkjoin/RecursiveAction.java
@@ -133,6 +133,7 @@ package scala.concurrent.forkjoin;
* @since 1.7
* @author Doug Lea
*/
+@Deprecated
public abstract class RecursiveAction extends ForkJoinTask<Void> {
private static final long serialVersionUID = 5232453952276485070L;
diff --git a/src/forkjoin/scala/concurrent/forkjoin/RecursiveTask.java b/src/forkjoin/scala/concurrent/forkjoin/RecursiveTask.java
index d1e1547143..097b7cda1f 100644
--- a/src/forkjoin/scala/concurrent/forkjoin/RecursiveTask.java
+++ b/src/forkjoin/scala/concurrent/forkjoin/RecursiveTask.java
@@ -36,6 +36,7 @@ package scala.concurrent.forkjoin;
* @since 1.7
* @author Doug Lea
*/
+@Deprecated
public abstract class RecursiveTask<V> extends ForkJoinTask<V> {
private static final long serialVersionUID = 5232453952276485270L;
diff --git a/src/forkjoin/scala/concurrent/forkjoin/ThreadLocalRandom.java b/src/forkjoin/scala/concurrent/forkjoin/ThreadLocalRandom.java
index 19237c9092..3ea1af66bc 100644
--- a/src/forkjoin/scala/concurrent/forkjoin/ThreadLocalRandom.java
+++ b/src/forkjoin/scala/concurrent/forkjoin/ThreadLocalRandom.java
@@ -32,6 +32,7 @@ import java.util.Random;
* @since 1.7
* @author Doug Lea
*/
+@Deprecated
public class ThreadLocalRandom extends Random {
// same constants as Random, but must be redeclared because private
private static final long multiplier = 0x5DEECE66DL;
@@ -80,6 +81,7 @@ public class ThreadLocalRandom extends Random {
*
* @return the current thread's {@code ThreadLocalRandom}
*/
+ @Deprecated
public static ThreadLocalRandom current() {
return localRandom.get();
}
diff --git a/src/forkjoin/scala/concurrent/forkjoin/TransferQueue.java b/src/forkjoin/scala/concurrent/forkjoin/TransferQueue.java
index 7d149c7ae5..4fcd8ea601 100644
--- a/src/forkjoin/scala/concurrent/forkjoin/TransferQueue.java
+++ b/src/forkjoin/scala/concurrent/forkjoin/TransferQueue.java
@@ -37,6 +37,7 @@ import java.util.concurrent.*;
* @author Doug Lea
* @param <E> the type of elements held in this collection
*/
+@Deprecated
public interface TransferQueue<E> extends BlockingQueue<E> {
/**
* Transfers the element to a waiting consumer immediately, if possible.
diff --git a/src/forkjoin/scala/concurrent/util/Unsafe.java b/src/forkjoin/scala/concurrent/util/Unsafe.java
index ef893c94d9..d82e4bbdd5 100644
--- a/src/forkjoin/scala/concurrent/util/Unsafe.java
+++ b/src/forkjoin/scala/concurrent/util/Unsafe.java
@@ -7,14 +7,12 @@
\* */
package scala.concurrent.util;
-
-
-
import java.lang.reflect.Field;
-
+@Deprecated
public final class Unsafe {
+ @Deprecated
public final static sun.misc.Unsafe instance;
static {
try {