From af2221682c2d4d7bceb1b9b17428e197c77de71d Mon Sep 17 00:00:00 2001 From: ehlxr Date: Thu, 16 Sep 2021 14:02:08 +0800 Subject: [PATCH] add function class --- .../ehlxr/function/BlockerActionConsumer.java | 74 ++++++++++++++++++ .../ehlxr/function/BlockerTaskFunction.java | 77 +++++++++++++++++++ .../ehlxr/function/CallableFunction.java | 47 +++++++++++ .../ehlxr/function/RecursiveTaskFunction.java | 48 ++++++++++++ .../ehlxr/function/RunnableConsumer.java | 46 +++++++++++ 5 files changed, 292 insertions(+) create mode 100644 budd-common/src/main/java/io/github/ehlxr/function/BlockerActionConsumer.java create mode 100644 budd-common/src/main/java/io/github/ehlxr/function/BlockerTaskFunction.java create mode 100644 budd-common/src/main/java/io/github/ehlxr/function/CallableFunction.java create mode 100644 budd-common/src/main/java/io/github/ehlxr/function/RecursiveTaskFunction.java create mode 100644 budd-common/src/main/java/io/github/ehlxr/function/RunnableConsumer.java diff --git a/budd-common/src/main/java/io/github/ehlxr/function/BlockerActionConsumer.java b/budd-common/src/main/java/io/github/ehlxr/function/BlockerActionConsumer.java new file mode 100644 index 0000000..df65ddf --- /dev/null +++ b/budd-common/src/main/java/io/github/ehlxr/function/BlockerActionConsumer.java @@ -0,0 +1,74 @@ +/* + * The MIT License (MIT) + * + * Copyright © 2021 xrv + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package io.github.ehlxr.function; + +import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.RecursiveAction; +import java.util.function.Consumer; + +/** + * @author ehlxr + * @since 2021-09-06 10:48. + */ +public class BlockerActionConsumer extends RecursiveAction { + private static final long serialVersionUID = 4942349095463615123L; + private final MyManagedBlockerImpl blocker; + + public BlockerActionConsumer(Consumer consumer, T t) { + this.blocker = new MyManagedBlockerImpl<>(consumer, t); + } + + @Override + protected void compute() { + try { + ForkJoinPool.managedBlock(blocker); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + + static class MyManagedBlockerImpl implements ForkJoinPool.ManagedBlocker { + private final Consumer consumer; + private final T t; + private boolean done = false; + + public MyManagedBlockerImpl(Consumer consumer, T t) { + this.consumer = consumer; + this.t = t; + } + + @Override + public boolean block() { + consumer.accept(t); + done = true; + return true; + } + + @Override + public boolean isReleasable() { + return done; + } + } +} diff --git a/budd-common/src/main/java/io/github/ehlxr/function/BlockerTaskFunction.java b/budd-common/src/main/java/io/github/ehlxr/function/BlockerTaskFunction.java new file mode 100644 index 0000000..b261356 --- /dev/null +++ b/budd-common/src/main/java/io/github/ehlxr/function/BlockerTaskFunction.java @@ -0,0 +1,77 @@ +/* + * The MIT License (MIT) + * + * Copyright © 2021 xrv + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package io.github.ehlxr.function; + +import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.RecursiveTask; +import java.util.function.Function; + +/** + * @author ehlxr + * @since 2021-09-06 10:39. + */ +public class BlockerTaskFunction extends RecursiveTask { + private static final long serialVersionUID = -4114798302790287199L; + private final MyManagedBlockerImpl blocker; + + public BlockerTaskFunction(Function function, T t) { + this.blocker = new MyManagedBlockerImpl<>(function, t); + } + + @Override + protected R compute() { + try { + ForkJoinPool.managedBlock(blocker); + setRawResult(blocker.r); + return getRawResult(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + + static class MyManagedBlockerImpl implements ForkJoinPool.ManagedBlocker { + private final Function function; + private final T t; + private R r; + private boolean done = false; + + public MyManagedBlockerImpl(Function function, T t) { + this.function = function; + this.t = t; + } + + @Override + public boolean block() { + r = function.apply(t); + done = true; + return true; + } + + @Override + public boolean isReleasable() { + return done; + } + } +} diff --git a/budd-common/src/main/java/io/github/ehlxr/function/CallableFunction.java b/budd-common/src/main/java/io/github/ehlxr/function/CallableFunction.java new file mode 100644 index 0000000..b911b1f --- /dev/null +++ b/budd-common/src/main/java/io/github/ehlxr/function/CallableFunction.java @@ -0,0 +1,47 @@ +/* + * The MIT License (MIT) + * + * Copyright © 2021 xrv + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package io.github.ehlxr.function; + +import java.util.concurrent.Callable; +import java.util.function.Function; + +/** + * @author ehlxr + * @since 2021-09-06 10:40. + */ +public class CallableFunction implements Callable { + private final T t; + private final Function function; + + public CallableFunction(Function function, T t) { + this.function = function; + this.t = t; + } + + @Override + public R call() { + return function.apply(t); + } +} \ No newline at end of file diff --git a/budd-common/src/main/java/io/github/ehlxr/function/RecursiveTaskFunction.java b/budd-common/src/main/java/io/github/ehlxr/function/RecursiveTaskFunction.java new file mode 100644 index 0000000..78077da --- /dev/null +++ b/budd-common/src/main/java/io/github/ehlxr/function/RecursiveTaskFunction.java @@ -0,0 +1,48 @@ +/* + * The MIT License (MIT) + * + * Copyright © 2021 xrv + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package io.github.ehlxr.function; + +import java.util.concurrent.RecursiveTask; +import java.util.function.Function; + +/** + * @author ehlxr + * @since 2021-09-06 10:41. + */ +public class RecursiveTaskFunction extends RecursiveTask { + private static final long serialVersionUID = 4451027118600634633L; + private final T t; + private final Function function; + + public RecursiveTaskFunction(Function function, T t) { + this.function = function; + this.t = t; + } + + @Override + protected R compute() { + return function.apply(t); + } +} diff --git a/budd-common/src/main/java/io/github/ehlxr/function/RunnableConsumer.java b/budd-common/src/main/java/io/github/ehlxr/function/RunnableConsumer.java new file mode 100644 index 0000000..968659f --- /dev/null +++ b/budd-common/src/main/java/io/github/ehlxr/function/RunnableConsumer.java @@ -0,0 +1,46 @@ +/* + * The MIT License (MIT) + * + * Copyright © 2021 xrv + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package io.github.ehlxr.function; + +import java.util.function.Consumer; + +/** + * @author ehlxr + * @since 2021-09-06 10:40. + */ +public class RunnableConsumer implements Runnable { + private final T t; + private final Consumer consumer; + + public RunnableConsumer(Consumer consumer, T t) { + this.consumer = consumer; + this.t = t; + } + + @Override + public void run() { + consumer.accept(t); + } +} \ No newline at end of file