@Nullable
	static final Object scanExecutor(Executor executor, Scannable.Attr key) {
		if (executor instanceof DelegateServiceScheduler.UnsupportedScheduledExecutorService) {
			executor = ((DelegateServiceScheduler.UnsupportedScheduledExecutorService) executor).get();
		}
		if (executor instanceof Scannable) {
			return ((Scannable) executor).scanUnsafe(key);
		}

		if (executor instanceof ExecutorService) {
			ExecutorService service = (ExecutorService) executor;
			if (key == Scannable.Attr.TERMINATED) return service.isTerminated();
			if (key == Scannable.Attr.CANCELLED) return service.isShutdown();
		}

		if (executor instanceof ThreadPoolExecutor) {
				final ThreadPoolExecutor poolExecutor = (ThreadPoolExecutor) executor;
				if (key == Scannable.Attr.CAPACITY) return poolExecutor.getMaximumPoolSize();
				if (key == Scannable.Attr.BUFFERED) return ((Long) (poolExecutor.getTaskCount() - poolExecutor.getCompletedTaskCount())).intValue();
				if (key == Scannable.Attr.LARGE_BUFFERED) return poolExecutor.getTaskCount() - poolExecutor.getCompletedTaskCount();
		}

		return null;
	}
@Nullable
	static final Object scanExecutor(Executor executor, Scannable.Attr key) {
		if (executor instanceof DelegateServiceScheduler.UnsupportedScheduledExecutorService) {
			executor = ((DelegateServiceScheduler.UnsupportedScheduledExecutorService) executor).get();
		}
		if (executor instanceof Scannable) {
			return ((Scannable) executor).scanUnsafe(key);
		}

		if (executor instanceof ExecutorService) {
			ExecutorService service = (ExecutorService) executor;
			if (key == Scannable.Attr.TERMINATED) return service.isTerminated();
			if (key == Scannable.Attr.CANCELLED) return service.isShutdown();
		}

		if (executor instanceof ThreadPoolExecutor) {
				final ThreadPoolExecutor poolExecutor = (ThreadPoolExecutor) executor;
				if (key == Scannable.Attr.CAPACITY) return poolExecutor.getMaximumPoolSize();
				if (key == Scannable.Attr.BUFFERED) return ((Long) (poolExecutor.getTaskCount() - poolExecutor.getCompletedTaskCount())).intValue();
				if (key == Scannable.Attr.LARGE_BUFFERED) return poolExecutor.getTaskCount() - poolExecutor.getCompletedTaskCount();
		}

		return null;
	}
@ Nullable static final Object scanExecutor ( Executor executor , Scannable . Attr key ) { if ( executor instanceof DelegateServiceScheduler . UnsupportedScheduledExecutorService ) { executor = ( ( DelegateServiceScheduler . UnsupportedScheduledExecutorService ) executor ) . get ( ) ; } if ( executor instanceof Scannable ) { return ( ( Scannable ) executor ) . scanUnsafe ( key ) ; } if ( executor instanceof ExecutorService ) { ExecutorService service = ( ExecutorService ) executor ; if ( key == Scannable . Attr . TERMINATED ) return service . isTerminated ( ) ; if ( key == Scannable . Attr . CANCELLED ) return service . isShutdown ( ) ; } if ( executor instanceof ThreadPoolExecutor ) { final ThreadPoolExecutor poolExecutor = ( ThreadPoolExecutor ) executor ; if ( key == Scannable . Attr . CAPACITY ) return poolExecutor . getMaximumPoolSize ( ) ; if ( key == Scannable . Attr . BUFFERED ) return ( ( Long ) ( poolExecutor . getTaskCount ( ) - poolExecutor . getCompletedTaskCount ( ) ) ) . intValue ( ) ; if ( key == Scannable . Attr . LARGE_BUFFERED ) return poolExecutor . getTaskCount ( ) - poolExecutor . getCompletedTaskCount ( ) ; } return null ; }
Scan an {@link Executor} or {@link ExecutorService}, recognizing several special
implementations. Unwraps some decorating schedulers, recognizes {@link Scannable}
schedulers and delegates to their {@link Scannable#scanUnsafe(Scannable.Attr)}
method, introspects {@link ThreadPoolExecutor} instances.
<p>
If no data can be extracted, defaults to the provided {@code orElse}
{@link Scannable#scanUnsafe(Scannable.Attr) scanUnsafe}.

@param executor the executor to introspect in a best effort manner.
@param key the key to scan for. CAPACITY and BUFFERED mainly.
@return an equivalent of {@link Scannable#scanUnsafe(Scannable.Attr)} but that can
also work on some implementations of {@link Executor}
Scan an { @link Executor } or { @link ExecutorService } recognizing several special implementations . Unwraps some decorating schedulers recognizes { @link Scannable } schedulers and delegates to their { @link Scannable#scanUnsafe ( Scannable . Attr ) } method introspects { @link ThreadPoolExecutor } instances . <p > If no data can be extracted defaults to the provided { @code orElse } { @link Scannable#scanUnsafe ( Scannable . Attr ) scanUnsafe } .