Motivation: We should update our code to use lamdas whenever possible Modifications: Use lambdas when possible Result: Cleanup code for Java8
85 lines
3.1 KiB
Java
85 lines
3.1 KiB
Java
/*
|
|
* Copyright 2019 The Netty Project
|
|
*
|
|
* The Netty Project licenses this file to you under the Apache License,
|
|
* version 2.0 (the "License"); you may not use this file except in compliance
|
|
* with the License. You may obtain a copy of the License at:
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
* License for the specific language governing permissions and limitations
|
|
* under the License.
|
|
*/
|
|
package io.netty.util.internal;
|
|
|
|
import io.netty.util.concurrent.EventExecutor;
|
|
import io.netty.util.concurrent.FastThreadLocal;
|
|
|
|
import java.util.Objects;
|
|
import java.util.concurrent.Executor;
|
|
import java.util.concurrent.ThreadFactory;
|
|
|
|
/**
|
|
* Allow to retrieve the {@link EventExecutor} for the calling {@link Thread}.
|
|
*/
|
|
public final class ThreadExecutorMap {
|
|
|
|
private static final FastThreadLocal<EventExecutor> mappings = new FastThreadLocal<EventExecutor>();
|
|
|
|
private ThreadExecutorMap() { }
|
|
|
|
/**
|
|
* Returns the current {@link EventExecutor} that uses the {@link Thread}, or {@code null} if none / unknown.
|
|
*/
|
|
public static EventExecutor currentExecutor() {
|
|
return mappings.get();
|
|
}
|
|
|
|
/**
|
|
* Set the current {@link EventExecutor} that is used by the {@link Thread}.
|
|
*/
|
|
private static void setCurrentEventExecutor(EventExecutor executor) {
|
|
mappings.set(executor);
|
|
}
|
|
|
|
/**
|
|
* Decorate the given {@link Executor} and ensure {@link #currentExecutor()} will return {@code eventExecutor}
|
|
* when called from within the {@link Runnable} during execution.
|
|
*/
|
|
public static Executor apply(final Executor executor, final EventExecutor eventExecutor) {
|
|
Objects.requireNonNull(executor, "executor");
|
|
Objects.requireNonNull(eventExecutor, "eventExecutor");
|
|
return command -> executor.execute(apply(command, eventExecutor));
|
|
}
|
|
|
|
/**
|
|
* Decorate the given {@link Runnable} and ensure {@link #currentExecutor()} will return {@code eventExecutor}
|
|
* when called from within the {@link Runnable} during execution.
|
|
*/
|
|
public static Runnable apply(final Runnable command, final EventExecutor eventExecutor) {
|
|
Objects.requireNonNull(command, "command");
|
|
Objects.requireNonNull(eventExecutor, "eventExecutor");
|
|
return () -> {
|
|
setCurrentEventExecutor(eventExecutor);
|
|
try {
|
|
command.run();
|
|
} finally {
|
|
setCurrentEventExecutor(null);
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Decorate the given {@link ThreadFactory} and ensure {@link #currentExecutor()} will return {@code eventExecutor}
|
|
* when called from within the {@link Runnable} during execution.
|
|
*/
|
|
public static ThreadFactory apply(final ThreadFactory threadFactory, final EventExecutor eventExecutor) {
|
|
Objects.requireNonNull(threadFactory, "command");
|
|
Objects.requireNonNull(eventExecutor, "eventExecutor");
|
|
return r -> threadFactory.newThread(apply(r, eventExecutor));
|
|
}
|
|
}
|