CachedService pick() { if (shutdown) { return SHUTDOWN; } CachedService result; ScheduledExecutorServiceExpiry e = cache.poll(); if (e != null) { return e.cached; } result = new CachedService(this); all.offer(result); if (shutdown) { all.remove(result); return SHUTDOWN; } return result; }
@Override public void run() { try { delegate.run(); } catch (Throwable ex) { Schedulers.handleError(ex); } finally { cached.dispose(); } } }
CachedService pick() { if (shutdown) { return SHUTDOWN; } CachedService result; ScheduledExecutorServiceExpiry e = cache.poll(); if (e != null) { return e.cached; } result = new CachedService(this); all.offer(result); if (shutdown) { all.remove(result); return SHUTDOWN; } return result; }
@Override public void run() { try { delegate.run(); } catch (Throwable ex) { Schedulers.handleError(ex); } finally { cached.dispose(); } } }
@Override public void dispose() { if (compareAndSet(false, true)) { tasks.dispose(); cached.dispose(); } }
@Override public Object scanUnsafe(Attr key) { if (key == Attr.NAME) return parent.scanUnsafe(key); if (key == Attr.PARENT) return parent; if (key == Attr.TERMINATED || key == Attr.CANCELLED) return isDisposed(); if (key == Attr.CAPACITY) { //assume 1 if unknown, otherwise use the one from underlying executor Integer capacity = (Integer) Schedulers.scanExecutor(exec, key); if (capacity == null || capacity == -1) return 1; } return Schedulers.scanExecutor(exec, key); } }
@Override public Object scanUnsafe(Attr key) { if (key == Attr.TERMINATED || key == Attr.CANCELLED) return isDisposed(); if (key == Attr.NAME) return cached.scanUnsafe(key) + ".worker"; if (key == Attr.PARENT) return cached.parent; return cached.scanUnsafe(key); } }
@Override public Object scanUnsafe(Attr key) { if (key == Attr.TERMINATED || key == Attr.CANCELLED) return isDisposed(); if (key == Attr.NAME) return cached.scanUnsafe(key) + ".worker"; if (key == Attr.PARENT) return cached.parent; return cached.scanUnsafe(key); } }
@Override public Object scanUnsafe(Attr key) { if (key == Attr.NAME) return parent.scanUnsafe(key); if (key == Attr.PARENT) return parent; if (key == Attr.TERMINATED || key == Attr.CANCELLED) return isDisposed(); if (key == Attr.CAPACITY) { //assume 1 if unknown, otherwise use the one from underlying executor Integer capacity = (Integer) Schedulers.scanExecutor(exec, key); if (capacity == null || capacity == -1) return 1; } return Schedulers.scanExecutor(exec, key); } }
@Override public void dispose() { if (compareAndSet(false, true)) { tasks.dispose(); cached.dispose(); } }