Class VirtualExecutorService

  • All Implemented Interfaces:
    java.util.concurrent.Executor, java.util.concurrent.ExecutorService

    public class VirtualExecutorService
    extends java.util.concurrent.AbstractExecutorService
    A delegating ExecutorService with its own termination management.

    VirtualExecutorService is used when you want to inject an ExecutorService but you do not want to allow the explicit termination of threads on shutdown request. It is particularly useful when the ExecutorService to inject is shared by different components and the life cycle of the components depend on the termination of the injected ExecutorService.

     ExecutorService globalExecutor = ...;
     ExecutorService virtualExecutor = new VirtualExecutorService(globalExecutor);
    
     ChannelFactory factory =
             new NioServerSocketChannelFactory(virtualExecutor, virtualExecutor);
     ...
    
     // ChannelFactory.releaseExternalResources() shuts down the executor and
     // interrupts the I/O threads to terminate all I/O tasks and to release all
     // resources acquired by ChannelFactory.
     factory.releaseExternalResources();
    
     // Note that globalExecutor is not shut down because VirtualExecutorService
     // implements its own termination management. All threads which were acquired
     // by ChannelFactory via VirtualExecutorService are returned to the pool.
     assert !globalExecutor.isShutdown();
     

    The differences from an ordinary ExecutorService

    A shutdown request (shutdown() or shutdownNow()) does not shut down its parent Executor but simply sets its internal flag to reject further execution request.

    shutdownNow() interrupts only the thread which is executing the task executed via VirtualExecutorService.

    awaitTermination(long, TimeUnit) does not wait for real thread termination but wait until VirtualExecutorService is shut down and its active tasks are finished and the threads are returned to the parent Executor.

    • Field Summary

      Fields 
      Modifier and Type Field Description
      (package private) java.util.Set<java.lang.Thread> activeThreads  
      private java.util.concurrent.Executor e  
      private java.util.concurrent.ExecutorService s  
      (package private) boolean shutdown  
      (package private) java.lang.Object startStopLock  
    • Constructor Summary

      Constructors 
      Constructor Description
      VirtualExecutorService​(java.util.concurrent.Executor parent)
      Creates a new instance with the specified parent Executor.
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      boolean awaitTermination​(long timeout, java.util.concurrent.TimeUnit unit)  
      void execute​(java.lang.Runnable command)  
      boolean isShutdown()  
      boolean isTerminated()  
      void shutdown()  
      java.util.List<java.lang.Runnable> shutdownNow()  
      • Methods inherited from class java.util.concurrent.AbstractExecutorService

        invokeAll, invokeAll, invokeAny, invokeAny, newTaskFor, newTaskFor, submit, submit, submit
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • e

        private final java.util.concurrent.Executor e
      • s

        private final java.util.concurrent.ExecutorService s
      • startStopLock

        final java.lang.Object startStopLock
      • shutdown

        volatile boolean shutdown
      • activeThreads

        final java.util.Set<java.lang.Thread> activeThreads
    • Constructor Detail

      • VirtualExecutorService

        public VirtualExecutorService​(java.util.concurrent.Executor parent)
        Creates a new instance with the specified parent Executor.
    • Method Detail

      • isShutdown

        public boolean isShutdown()
      • isTerminated

        public boolean isTerminated()
      • shutdown

        public void shutdown()
      • shutdownNow

        public java.util.List<java.lang.Runnable> shutdownNow()
      • awaitTermination

        public boolean awaitTermination​(long timeout,
                                        java.util.concurrent.TimeUnit unit)
                                 throws java.lang.InterruptedException
        Throws:
        java.lang.InterruptedException
      • execute

        public void execute​(java.lang.Runnable command)