zoukankan      html  css  js  c++  java
  • Java线程池中submit()和execute之间的区别?

    一:
    submit()方法,可以提供Future < T > 类型的返回值。
    executor()方法,无返回值。

    execute无返回值

    public void execute(Runnable command) {
            if (command == null)
                throw new NullPointerException();//抛掉异常
            int c = ctl.get();
            if (workerCountOf(c) < corePoolSize) {
                if (addWorker(command, true))
                    return;
                c = ctl.get();
            }
            if (isRunning(c) && workQueue.offer(command)) {
                int recheck = ctl.get();
                if (! isRunning(recheck) && remove(command))
                    reject(command);
                else if (workerCountOf(recheck) == 0)
                    addWorker(null, false);
            }
            else if (!addWorker(command, false))
                reject(command);
        }
    

    submit有Future返回值 :

    /**
         * @throws RejectedExecutionException {@inheritDoc}
         * @throws NullPointerException       {@inheritDoc}
         */
        public Future<?> submit(Runnable task) {
            if (task == null) throw new NullPointerException();
            RunnableFuture<Void> ftask = newTaskFor(task, null);
            execute(ftask);
            return ftask;
        }
    
        /**
         * @throws RejectedExecutionException {@inheritDoc}
         * @throws NullPointerException       {@inheritDoc}
         */
        public <T> Future<T> submit(Runnable task, T result) {
            if (task == null) throw new NullPointerException();
            RunnableFuture<T> ftask = newTaskFor(task, result);
            execute(ftask);
            return ftask;
        }
    
        /**
         * @throws RejectedExecutionException {@inheritDoc}
         * @throws NullPointerException       {@inheritDoc}
         */
        public <T> Future<T> submit(Callable<T> task) {
            if (task == null) throw new NullPointerException();
            RunnableFuture<T> ftask = newTaskFor(task);
            execute(ftask);
            return ftask;
        }
    

    二:
    excute方法会抛出异常。
    sumbit方法不会抛出异常。除非你调用Future.get()。


    三:
    excute入参Runnable
    submit入参可以为Callable,也可以为Runnable。

    public interface Executor {
        void execute(Runnable command);
    }
    
    public interface ExecutorService extends Executor {
      ...
      <T> Future<T> submit(Callable<T> task);
     
      <T> Future<T> submit(Runnable task, T result);
     
      Future<?> submit(Runnable task);
      ...
    }
    
  • 相关阅读:
    怎样修改原型对象prototype
    怎样获取构造函数的名字
    怎样把实例对象当构造函数用
    怎样理解prototype对象的constructor属性
    怎样理解构造函数的原型对象prototype
    怎样给回调函数绑定this
    怎样绑定this
    怎样理解数组的空元素empty与undefined的区别
    怎样找出数组中的最大数值
    怎样调用对象的原生方法
  • 原文地址:https://www.cnblogs.com/androidsuperman/p/9784821.html
Copyright © 2011-2022 走看看