code: public static <T> T get(Future<T> future, String callerClass, String callerMethod, Object... args)
  	throws InterruptedException, ExecutionException {
  		final String sourceMethod = "get"; //$NON-NLS-1$
  		final boolean isTraceLogging = log.isLoggable(Level.FINER);
  		if (isTraceLogging) {
  			log.entering(sourceClass, sourceMethod, new Object[]{Thread.currentThread(), future, callerClass, callerMethod, args});
  		}
  		T result = null;
  		long start = System.currentTimeMillis();
  		boolean quiesced = false, logged = false;
  		while (true) {
  			try {
  				result = future.get(SignalUtil.SIGNAL_LOG_INTERVAL_SECONDS, TimeUnit.SECONDS);
  				break;
  			} catch (TimeoutException tex) {
  				if (!quiesced) {
  					quiesced = logWaiting(callerClass, callerMethod, future, start, args);
  					logged = true;
  				}
  			}
  		}
  		if (logged) {
  			logResuming(callerClass, callerMethod, future, start);
  		}
  		if (isTraceLogging) {
  			log.exiting(sourceClass, sourceMethod, Arrays.asList(Thread.currentThread(), future, callerClass, callerMethod, result));
  		}
  		return result;
  	}
docs: Implements the same semantics as {@link Future#get()}, except that the wait will periodically
  time out within this method to log a warning message that the thread appears stuck. This
  cycle will be repeated until the result is available. If the thread has waited for an extended
  period, then wait logging is quiesced to avoid overwhelming the logs. If and when a thread
  that has been reported as being stuck finally does obtain the result, then a warning level
  message is logged to indicate that the thread is resuming.
  
  @param <T>
  Generic for the type of the result
  @param future
  the Future to obtain the result from
  @param callerClass
  the caller class
  @param callerMethod
  the caller method
  @param args
  extra arguments to be appended to the log message
  @return the result from the future
  @throws InterruptedException
  @throws ExecutionException