/******************************************************************************* * Copyright 2014 Analog Devices, Inc. * * Licensed 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 com.analog.lyric.dimple.environment; import org.eclipse.jdt.annotation.Nullable; /** * An extension of standard {@link Thread} class that inherits its active dimple environment from its parent thread. * <p> * Use this in place of the standard {@link Thread} class to ensure that new threads inherit * the same {@link DimpleEnvironment#active()} value as their creating thread. * <p> * @see DimpleThreadFactory * @since 0.07 * @author Christopher Barber */ public class DimpleThread extends Thread implements IDimpleEnvironmentHolder { private final DimpleEnvironment _env; /*-------------- * Construction */ /** * Sets {@linkplain #getEnvironment environment} to {@link DimpleEnvironment#active()}. * Otherwise is the same as {@link Thread#Thread()} constructor. * @since 0.07 */ public DimpleThread() { super(); _env = DimpleEnvironment.active(); } /** * Sets {@linkplain #getEnvironment environment} to {@link DimpleEnvironment#active()}. * Otherwise is the same as {@link Thread#Thread(Runnable)} constructor. * @since 0.07 */ public DimpleThread(Runnable target) { this(DimpleEnvironment.active(), target); } /** * Sets {@linkplain #getEnvironment environment} to specified value. * Otherwise is the same as {@link Thread#Thread(Runnable)} constructor. * @since 0.07 */ public DimpleThread(DimpleEnvironment env, Runnable target) { super(target); _env = env; } /** * Sets {@linkplain #getEnvironment environment} to {@link DimpleEnvironment#active()}. * Otherwise is the same as {@link Thread#Thread(ThreadGroup, Runnable)} constructor. * @since 0.07 */ public DimpleThread(ThreadGroup group, Runnable target) { this(DimpleEnvironment.active(), group, target); } /** * Sets {@linkplain #getEnvironment environment} to specified value. * Otherwise is the same as {@link Thread#Thread(ThreadGroup, Runnable)} constructor. * @since 0.07 */ public DimpleThread(DimpleEnvironment env, ThreadGroup group, Runnable target) { super(group, target); _env = env; } /** * Sets {@linkplain #getEnvironment environment} to {@link DimpleEnvironment#active()}. * Otherwise is the same as {@link Thread#Thread(String)} constructor. * @since 0.07 */ public DimpleThread(String name) { this(null, null, name, 0L, null); } /** * Sets {@linkplain #getEnvironment environment} to {@link DimpleEnvironment#active()}. * Otherwise is the same as {@link Thread#Thread(ThreadGroup,String)} constructor. * @since 0.07 */ public DimpleThread(ThreadGroup group, String name) { this(group, null, name, 0L, null); } /** * Sets {@linkplain #getEnvironment environment} to {@link DimpleEnvironment#active()}. * Otherwise is the same as {@link Thread#Thread(Runnable,String)} constructor. * @since 0.07 */ public DimpleThread(Runnable target, String name) { this(null, target, name, 0L, null); } /** * Sets {@linkplain #getEnvironment environment} to specified value. * Otherwise is the same as {@link Thread#Thread(Runnable,String)} constructor. * @since 0.07 */ public DimpleThread(DimpleEnvironment env, Runnable target, String name) { this(null, target, name, 0L, env); } /** * Sets {@linkplain #getEnvironment environment} to {@link DimpleEnvironment#active()}. * Otherwise is the same as {@link Thread#Thread(ThreadGroup,Runnable,String)} constructor. * @since 0.07 */ public DimpleThread(ThreadGroup group, Runnable target, String name) { this(group, target, name, 0L, null); } /** * Sets {@linkplain #getEnvironment environment} to specified value. * Otherwise is the same as {@link Thread#Thread(ThreadGroup,Runnable,String)} constructor. * @since 0.07 */ public DimpleThread(DimpleEnvironment env, ThreadGroup group, Runnable target, String name) { this(group, target, name, 0L, env); } /** * Sets {@linkplain #getEnvironment environment} to {@link DimpleEnvironment#active()}. * Otherwise is the same as {@link Thread#Thread(ThreadGroup,Runnable,String,long)} constructor. * @since 0.07 */ public DimpleThread(ThreadGroup group, Runnable target, String name, long stackSize) { this(group, target, name, stackSize, null); } /** * Sets {@linkplain #getEnvironment environment} to specified value. * Otherwise is the same as {@link Thread#Thread(ThreadGroup,Runnable,String,long)} constructor. * @since 0.07 */ public DimpleThread(DimpleEnvironment env, ThreadGroup group, Runnable target, String name, long stackSize) { this(group, target, name, stackSize, env); } private DimpleThread( @Nullable ThreadGroup group, @Nullable Runnable target, String name, long stackSize, @Nullable DimpleEnvironment env) { super(group, target, name, stackSize); _env = env != null ? env : DimpleEnvironment.active(); } /*---------------------------------- * IDimpleEnvironmentHolder methods */ /** * The {@linkplain DimpleEnvironment#active active dimple environment} for this thread. * <p> * This is set during construction and is either an explicitly specified environment or is * the active environment of the thread in which this thread object was created. * @see #run * @since 0.07 */ @Override public DimpleEnvironment getEnvironment() { return _env; } /*---------------- * Thread methods */ /** * Runs the body of the thread. * <p> * Sets the thread's {@linkplain DimpleEnvironment#active active dimple environment} to * {@linkplain #getEnvironment() environment specified in constructor} and then invokes * {@link Thread#run}. * <p> * If overridden, the implementation must begin with: * <blockquote> * <pre> * super.run(); * </pre> * </blockquote> */ @Override public void run() { DimpleEnvironment.setActive(_env); super.run(); } }