• 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);
      ...
    }
    
  • 相关阅读:
    第二章、开发环境部署
    第一章、数据分析介绍
    爬虫之Beautiful Soup
    爬虫之selenium
    使用Python连接Mongodb,对数据库进行操作
    Python练习实例002
    Python练习实例001
    Python入门练手100例
    Python
    剑指Offer-003:从尾到头打印链表
  • 原文地址:https://www.cnblogs.com/androidsuperman/p/9784821.html
Copyright © 2020-2023  润新知