/* * Licensed to the Apache Software Foundation (ASF) under one or more contributor license * agreements. See the NOTICE file distributed with this work for additional information regarding * copyright ownership. The ASF 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 org.apache.geode.internal.lang; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.lang.Thread.State; /** * The ThreadUtils class is an abstract utility class for working with and invoking methods on * Threads. * <p/> * * @see java.lang.Thread * @since GemFire 7.0 */ public abstract class ThreadUtils { /** * Gets the name of the particular Thread or null if the Thread object reference is null. * <p/> * * @param thread the Thread object whose name is returned. * @return a String value indicating the name of the Thread or null if the Thread object reference * is null. * @see java.lang.Thread#getName() */ public static String getThreadName(final Thread thread) { return (thread == null ? null : thread.getName()); } /** * Interrupts the specified Thread, guarding against null. * <p/> * * @param thread the Thread to interrupt. * @see java.lang.Thread#interrupt() */ public static void interrupt(final Thread thread) { if (thread != null) { thread.interrupt(); } } /** * Determines whether the specified Thread is alive, guarding against null Object references. * <p/> * * @param thread the Thread to determine for aliveness. * @return a boolean value indicating whether the specified Thread is alive. Will return false if * the Thread Object references is null. * @see java.lang.Thread#isAlive() */ public static boolean isAlive(final Thread thread) { return (thread != null && thread.isAlive()); } /** * Determines whether the specified Thread is in a waiting state, guarding against null Object * references * <p/> * * @param thread the Thread to access it's state. * @return a boolean value indicating whether the Thread is in a waiting state. If the Thread * Object reference is null, then this method return false, as no Thread is clearly not * waiting for anything. * @see java.lang.Thread#getState() * @see java.lang.Thread.State#WAITING */ public static boolean isWaiting(final Thread thread) { return (thread != null && thread.getState().equals(State.WAITING)); } /** * Causes the current Thread to sleep for the specified number of milliseconds. If the current * Thread is interrupted during sleep, the interrupt flag on the current Thread will remain set * and the duration, in milliseconds, of completed sleep is returned. * <p/> * * @param milliseconds an integer value specifying the number of milliseconds the current Thread * should sleep. * @return a long value indicating duration in milliseconds of completed sleep by the current * Thread. * @see java.lang.System#nanoTime() * @see java.lang.Thread#sleep(long) */ public static long sleep(final long milliseconds) { final long t0 = System.nanoTime(); try { Thread.sleep(milliseconds); } catch (InterruptedException ignore) { Thread.currentThread().interrupt(); } return (System.nanoTime() - t0) / 1000; } /** * Returns a stack trace of the {@code Throwable} as a {@code String}. * * @param throwable The throwable for which to create the stack trace. * @param expectNull True if null should be returned when {@code throwable} is null or false to * return "" when {@code throwable} is null * @return null if {@code throwable} is null and {@code expectNull} is true, "" if * {@code throwable} is null and {@code expectNull} is false, otherwise the stack trace * for {@code throwable} */ public static String stackTraceToString(final Throwable throwable, final boolean expectNull) { if (throwable == null) { if (expectNull == true) { return null; } return ""; } StringWriter stringWriter = new StringWriter(); PrintWriter printWriter = new PrintWriter(stringWriter); throwable.printStackTrace(printWriter); printWriter.close(); return stringWriter.toString(); } }