Added CompletableFuture Support and fixed a small bug in a test
This commit is contained in:
+26
@@ -1,6 +1,7 @@
|
|||||||
package speiger.src.collections.PACKAGE.utils;
|
package speiger.src.collections.PACKAGE.utils;
|
||||||
|
|
||||||
import java.util.concurrent.CancellationException;
|
import java.util.concurrent.CancellationException;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
@@ -520,6 +521,16 @@ public class ASYNC_BUILDER KEY_GENERIC_TYPE
|
|||||||
return toRun.GET_KEY(timeout, unit);
|
return toRun.GET_KEY(timeout, unit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts the execution of the task and returns a future so it can be used with a future.
|
||||||
|
* @return the task as a future
|
||||||
|
*/
|
||||||
|
public CompletableFuture<CLASS_TYPE> toFuture() {
|
||||||
|
BASE_TASK KEY_GENERIC_TYPE toRun = task;
|
||||||
|
task = null;
|
||||||
|
return toRun.toFuture();
|
||||||
|
}
|
||||||
|
|
||||||
#if !TYPE_OBJECT
|
#if !TYPE_OBJECT
|
||||||
private static class ReduceTask extends BASE_TASK
|
private static class ReduceTask extends BASE_TASK
|
||||||
{
|
{
|
||||||
@@ -881,6 +892,7 @@ public class ASYNC_BUILDER KEY_GENERIC_TYPE
|
|||||||
private static final int CANCELLED = 7;
|
private static final int CANCELLED = 7;
|
||||||
private volatile WaitNode waiter;
|
private volatile WaitNode waiter;
|
||||||
private volatile int state = CREATED;
|
private volatile int state = CREATED;
|
||||||
|
private volatile boolean locked = false;
|
||||||
Consumer<TASK KEY_GENERIC_TYPE> callback;
|
Consumer<TASK KEY_GENERIC_TYPE> callback;
|
||||||
Executor executor = SanityChecks::invokeAsyncTask;
|
Executor executor = SanityChecks::invokeAsyncTask;
|
||||||
KEY_TYPE result;
|
KEY_TYPE result;
|
||||||
@@ -950,6 +962,17 @@ public class ASYNC_BUILDER KEY_GENERIC_TYPE
|
|||||||
onCompletion();
|
onCompletion();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CompletableFuture<CLASS_TYPE> toFuture() {
|
||||||
|
locked = true;
|
||||||
|
Executor exe = this.executor;
|
||||||
|
this.executor = Runnable::run;
|
||||||
|
return CompletableFuture.supplyAsync(() -> {
|
||||||
|
begin();
|
||||||
|
try { return GET_KEY(); }
|
||||||
|
catch(Exception e) { throw new RuntimeException(e); }
|
||||||
|
}, exe);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean cancel(boolean cancelIfRunnning) {
|
public boolean cancel(boolean cancelIfRunnning) {
|
||||||
if(state == RUNNING && !cancelIfRunnning) return false;
|
if(state == RUNNING && !cancelIfRunnning) return false;
|
||||||
@@ -1044,12 +1067,14 @@ public class ASYNC_BUILDER KEY_GENERIC_TYPE
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void pause() {
|
public void pause() {
|
||||||
|
if(locked) throw new IllegalStateException("Completable Future Wrap doesn't support pause");
|
||||||
if(state == PAUSED || state == PAUSING || state >= FINISHING) return;
|
if(state == PAUSED || state == PAUSING || state >= FINISHING) return;
|
||||||
state = PAUSING;
|
state = PAUSING;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void awaitPausing() {
|
public void awaitPausing() {
|
||||||
|
if(locked) throw new IllegalStateException("Completable Future Wrap doesn't support pause");
|
||||||
if(state == PAUSED) return;
|
if(state == PAUSED) return;
|
||||||
pause();
|
pause();
|
||||||
if(state == PAUSING) {
|
if(state == PAUSING) {
|
||||||
@@ -1061,6 +1086,7 @@ public class ASYNC_BUILDER KEY_GENERIC_TYPE
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void resume() {
|
public void resume() {
|
||||||
|
if(locked) throw new IllegalStateException("Completable Future Wrap doesn't support pause");
|
||||||
if(state != PAUSED && state != PAUSING) return;
|
if(state != PAUSED && state != PAUSING) return;
|
||||||
if(state == PAUSING) {
|
if(state == PAUSING) {
|
||||||
while(state == PAUSING) {
|
while(state == PAUSING) {
|
||||||
|
|||||||
@@ -153,9 +153,6 @@ public class COLLECTIONS
|
|||||||
/**
|
/**
|
||||||
* Internal Use mainly. Its a collection wrapper with 0 dependencies for those actions where a collector is needed.
|
* Internal Use mainly. Its a collection wrapper with 0 dependencies for those actions where a collector is needed.
|
||||||
*/
|
*/
|
||||||
#if !TYPE_OBJECT
|
|
||||||
@SuppressWarnings("exports")
|
|
||||||
#endif
|
|
||||||
public static GENERIC_KEY_BRACES CollectionWrapper KEY_GENERIC_TYPE wrapper() {
|
public static GENERIC_KEY_BRACES CollectionWrapper KEY_GENERIC_TYPE wrapper() {
|
||||||
return new CollectionWrapperBRACES();
|
return new CollectionWrapperBRACES();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ public abstract class BaseInt2IntMapTest
|
|||||||
if(!getValidMapTests().contains(MapTests.PUT)) return;
|
if(!getValidMapTests().contains(MapTests.PUT)) return;
|
||||||
Int2IntMap putMap = createMap(PUT_ARRAY, PUT_VALUE_ARRAY);
|
Int2IntMap putMap = createMap(PUT_ARRAY, PUT_VALUE_ARRAY);
|
||||||
Assert.assertEquals(PUT_ARRAY.length, putMap.size());
|
Assert.assertEquals(PUT_ARRAY.length, putMap.size());
|
||||||
Assert.assertEquals(0, putMap.put(0, 512));
|
Assert.assertEquals(putMap.getDefaultReturnValue(), putMap.put(0, 512));
|
||||||
Assert.assertEquals(1, putMap.put(513, 2));
|
Assert.assertEquals(1, putMap.put(513, 2));
|
||||||
Assert.assertEquals(PUT_ARRAY.length + 1, putMap.size());
|
Assert.assertEquals(PUT_ARRAY.length + 1, putMap.size());
|
||||||
Assert.assertEquals(512, putMap.addTo(0, 1));
|
Assert.assertEquals(512, putMap.addTo(0, 1));
|
||||||
|
|||||||
Reference in New Issue
Block a user