test_class.declarator: executionList
test_class.modifier: private
test_class.original_string: private ExecutionList executionList;
test_class.type: ExecutionList
test_class.var_name: executionList
test_class.file: dubbo-common/src/test/java/com/alibaba/dubbo/common/concurrent/ExecutionListTest.java
test_class.identifier: ExecutionListTest
test_case.body: @Test(expected = NullPointerException.class)
      public void testAddNullRunnable() {
          this.executionList.add(null, mock(Executor.class));
      }
test_case.class_method_signature: ExecutionListTest.testAddNullRunnable()
test_case.full_signature: @Test(expected = NullPointerException.class) public void testAddNullRunnable()
test_case.identifier: testAddNullRunnable
test_case.invocations: add mock
test_case.modifiers: @Test(expected = NullPointerException.class) public
test_case.parameters: ()
test_case.return: void
test_case.signature: void testAddNullRunnable()
focal_class.declarator: logger = LoggerFactory.getLogger(ExecutionList.class.getName())
focal_class.modifier: static final
focal_class.original_string: static final Logger logger = LoggerFactory.getLogger(ExecutionList.class.getName());
focal_class.type: Logger
focal_class.var_name: logger
focal_class.declarator: runnables
focal_class.modifier: private
focal_class.original_string: private RunnableExecutorPair runnables;
focal_class.type: RunnableExecutorPair
focal_class.var_name: runnables
focal_class.declarator: executed
focal_class.modifier: private
focal_class.original_string: private boolean executed;
focal_class.type: boolean
focal_class.var_name: executed
focal_class.declarator: DEFAULT_EXECUTOR = new ThreadPoolExecutor(1, 10, 60000L, TimeUnit.MILLISECONDS, new SynchronousQueue<Runnable>(), new NamedThreadFactory("DubboFutureCallbackDefault", true))
focal_class.modifier: private static final
focal_class.original_string: private static final Executor DEFAULT_EXECUTOR = new ThreadPoolExecutor(1, 10, 60000L, TimeUnit.MILLISECONDS, new SynchronousQueue<Runnable>(), new NamedThreadFactory("DubboFutureCallbackDefault", true));
focal_class.type: Executor
focal_class.var_name: DEFAULT_EXECUTOR
focal_class.file: dubbo-common/src/main/java/com/alibaba/dubbo/common/concurrent/ExecutionList.java
focal_class.identifier: ExecutionList
focal_class.class_method_signature: ExecutionList.ExecutionList()
focal_class.full_signature: public  ExecutionList()
focal_class.identifier: ExecutionList
focal_class.modifiers: public
focal_class.parameters: ()
focal_class.signature:  ExecutionList()
focal_class.class_method_signature: ExecutionList.add(Runnable runnable, Executor executor)
focal_class.full_signature: public void add(Runnable runnable, Executor executor)
focal_class.identifier: add
focal_class.modifiers: public
focal_class.parameters: (Runnable runnable, Executor executor)
focal_class.return: void
focal_class.signature: void add(Runnable runnable, Executor executor)
focal_class.class_method_signature: ExecutionList.execute()
focal_class.full_signature: public void execute()
focal_class.identifier: execute
focal_class.modifiers: public
focal_class.parameters: ()
focal_class.return: void
focal_class.signature: void execute()
focal_class.class_method_signature: ExecutionList.executeListener(Runnable runnable, Executor executor)
focal_class.full_signature: private static void executeListener(Runnable runnable, Executor executor)
focal_class.identifier: executeListener
focal_class.modifiers: private static
focal_class.parameters: (Runnable runnable, Executor executor)
focal_class.return: void
focal_class.signature: void executeListener(Runnable runnable, Executor executor)
focal_method.body: public void add(Runnable runnable, Executor executor) {
          // Fail fast on a null.  We throw NPE here because the contract of
          // Executor states that it throws NPE on null listener, so we propagate
          // that contract up into the add method as well.
          if (runnable == null) {
              throw new NullPointerException("Runnable can not be null!");
          }
          if (executor == null) {
              logger.info("Executor for listenablefuture is null, will use default executor!");
              executor = DEFAULT_EXECUTOR;
          }
          // Lock while we check state.  We must maintain the lock while adding the
          // new pair so that another thread can't run the list out from under us.
          // We only add to the list if we have not yet started execution.
          synchronized (this) {
              if (!executed) {
                  runnables = new RunnableExecutorPair(runnable, executor, runnables);
                  return;
              }
          }
          // Execute the runnable immediately. Because of scheduling this may end up
          // getting called before some of the previously added runnables, but we're
          // OK with that.  If we want to change the contract to guarantee ordering
          // among runnables we'd have to modify the logic here to allow it.
          executeListener(runnable, executor);
      }
focal_method.class_method_signature: ExecutionList.add(Runnable runnable, Executor executor)
focal_method.full_signature: public void add(Runnable runnable, Executor executor)
focal_method.identifier: add
focal_method.invocations: info executeListener
focal_method.modifiers: public
focal_method.parameters: (Runnable runnable, Executor executor)
focal_method.return: void
focal_method.signature: void add(Runnable runnable, Executor executor)