@Override public void send( T event ) { AsyncEvent prev = STACK_UPDATER.getAndSet( this, event ); assert prev != null; event.next = prev; if ( prev == END_SENTINEL ) { LockSupport.unpark( backgroundThread ); } else if ( prev == SHUTDOWN_SENTINEL ) { AsyncEvent events = STACK_UPDATER.getAndSet( this, SHUTDOWN_SENTINEL ); process( events ); } }
@Override public void run() { assert backgroundThread == null : "A thread is already running " + backgroundThread; backgroundThread = Thread.currentThread(); startupLatch.release(); try { do { AsyncEvent events = STACK_UPDATER.getAndSet( this, END_SENTINEL ); process( events ); if ( stack == END_SENTINEL && !shutdown ) { LockSupport.park( this ); } } while ( !shutdown ); AsyncEvent events = STACK_UPDATER.getAndSet( this, SHUTDOWN_SENTINEL ); process( events ); } finally { backgroundThread = null; shutdownLatch.release(); } }
@Override public void send( T event ) { AsyncEvent prev = STACK_UPDATER.getAndSet( this, event ); assert prev != null; event.next = prev; if ( prev == END_SENTINEL ) { LockSupport.unpark( backgroundThread ); } else if ( prev == SHUTDOWN_SENTINEL ) { AsyncEvent events = STACK_UPDATER.getAndSet( this, SHUTDOWN_SENTINEL ); process( events ); } }
@Override public void run() { assert backgroundThread == null : "A thread is already running " + backgroundThread; backgroundThread = Thread.currentThread(); startupLatch.release(); try { do { AsyncEvent events = STACK_UPDATER.getAndSet( this, END_SENTINEL ); process( events ); if ( stack == END_SENTINEL && !shutdown ) { LockSupport.park( this ); } } while ( !shutdown ); AsyncEvent events = STACK_UPDATER.getAndSet( this, SHUTDOWN_SENTINEL ); process( events ); } finally { backgroundThread = null; shutdownLatch.release(); } }