`

读AbstractExecutorService

阅读更多
//他是ExecutorService的部分实现
public abstract class AbstractExecutorService implements ExecutorService

//提交一个Runnable任务给AbstractExecutorService执行返回Future
public Future<?> submit(Runnable task) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<Void> ftask = newTaskFor(task, null);
        execute(ftask);
        return ftask;
    }

protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
        return new FutureTask<T>(runnable, value);
    }

//提交一个Runnable任务并指定返回值给AbstractExecutorService执行返回Future
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;
    }

//提交一个Callable任务并指定返回值给AbstractExecutorService执行返回Future
public <T> Future<T> submit(Callable<T> task) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<T> ftask = newTaskFor(task);
        execute(ftask);
        return ftask;
    }


//一旦有任务执行成功就返回
public <T> T invokeAny(Collection<? extends Callable<T>> tasks)
        throws InterruptedException, ExecutionException {
        try {
            return doInvokeAny(tasks, false, 0);
        } catch (TimeoutException cannotHappen) {
            assert false;
            return null;
        }
    }

private <T> T doInvokeAny(Collection<? extends Callable<T>> tasks,
                            boolean timed, long nanos)
        throws InterruptedException, ExecutionException, TimeoutException {
        if (tasks == null)
            throw new NullPointerException();
        int ntasks = tasks.size();
        if (ntasks == 0)
            throw new IllegalArgumentException();
        List<Future<T>> futures= new ArrayList<Future<T>>(ntasks);
        ExecutorCompletionService<T> ecs =
            new ExecutorCompletionService<T>(this);

        try {
            
            ExecutionException ee = null;
            long lastTime = timed ? System.nanoTime() : 0;
            Iterator<? extends Callable<T>> it = tasks.iterator();
            //将任务加入到futures集合中
            futures.add(ecs.submit(it.next()));
            --ntasks;
            int active = 1;

            for (;;) {
	       //获取Future
                Future<T> f = ecs.poll();
		//当前没有完成的任务
                if (f == null) {
		    //还有任务未提交
                    if (ntasks > 0) {
                        --ntasks;
			//再提交一个任务
                        futures.add(ecs.submit(it.next()));
                        ++active;
                    }
		    //没有活动的任务重新循环
                    else if (active == 0)
                        break;
	            //如果有超时
                    else if (timed) {
                        f = ecs.poll(nanos, TimeUnit.NANOSECONDS);
			//超时抛出异常
                        if (f == null)
                            throw new TimeoutException();
                        long now = System.nanoTime();
                        nanos -= now - lastTime;
                        lastTime = now;
                    }
                    else
		        //都没有则阻塞获取Future
                        f = ecs.take();
                }
                if (f != null) {
                    --active;
                    try {
                        return f.get();
                    } catch (ExecutionException eex) {
                        ee = eex;
                    } catch (RuntimeException rex) {
                        ee = new ExecutionException(rex);
                    }
                }
            }

            if (ee == null)
                ee = new ExecutionException();
            throw ee;

        } finally {
            for (Future<T> f : futures)
	       //尝试取消完成的任务
                f.cancel(true);
        }
    }


//一旦有任务执行成功就返回,超时抛出异常
   public <T> T invokeAny(Collection<? extends Callable<T>> tasks,
                           long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException {
        return doInvokeAny(tasks, true, unit.toNanos(timeout));
    }


//执行所有Futrue返回完成任务的Future列表
public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
        throws InterruptedException {
        if (tasks == null)
            throw new NullPointerException();
        List<Future<T>> futures = new ArrayList<Future<T>>(tasks.size());
        boolean done = false;
        try {
            for (Callable<T> t : tasks) {
                RunnableFuture<T> f = newTaskFor(t);
                futures.add(f);
                execute(f);
            }
            for (Future<T> f : futures) {
	        //如果任务还没有完成
                if (!f.isDone()) {
                    try {
		       //获取
                        f.get();
                    } catch (CancellationException ignore) {
                    } catch (ExecutionException ignore) {
                    }
                }
            }
            done = true;
            return futures;
        } finally {
	     //如果没有任务完成,尝试取消Future
            if (!done)
                for (Future<T> f : futures)
                    f.cancel(true);
        }
    }


//执行所有任务返回所有未超时并且执行了的任务
public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,
                                         long timeout, TimeUnit unit)
        throws InterruptedException {
        if (tasks == null || unit == null)
            throw new NullPointerException();
        long nanos = unit.toNanos(timeout);
        List<Future<T>> futures = new ArrayList<Future<T>>(tasks.size());
        boolean done = false;
        try {
            for (Callable<T> t : tasks)
                futures.add(newTaskFor(t));

            long lastTime = System.nanoTime();

            
            Iterator<Future<T>> it = futures.iterator();
            while (it.hasNext()) {
                execute((Runnable)(it.next()));
                long now = System.nanoTime();
                nanos -= now - lastTime;
                lastTime = now;
		//超时了直接返回
                if (nanos <= 0)
                    return futures;
            }

            for (Future<T> f : futures) {
	        //如果任务还为完成
                if (!f.isDone()) {
		   //超时了直接返回
                    if (nanos <= 0)
                        return futures;
                    try {
                        f.get(nanos, TimeUnit.NANOSECONDS);
                    } catch (CancellationException ignore) {
                    } catch (ExecutionException ignore) {
                    } catch (TimeoutException toe) {
		        //超时异常直接返回
                        return futures;
                    }
                    long now = System.nanoTime();
                    nanos -= now - lastTime;
                    lastTime = now;
                }
            }
            done = true;
            return futures;
        } finally {
	    //所有任务并没有全部返回(可能抛出异常等)
            if (!done)
                for (Future<T> f : futures)
                    f.cancel(true);
        }
    }

分享到:
评论

相关推荐

    3_AbstractExecutorService源码阅读1

    `AbstractExecutorService`是Java并发编程中的一个关键抽象类,它是`ExecutorService`接口的一个实现基础。`ExecutorService`接口是`java.util.concurrent`包的一部分,用于管理和控制线程的执行,提供了一种将任务...

    AbrastractExecutorService

    `AbstractExecutorService`是Java并发工具包`java.util.concurrent`中的一个抽象类,它提供了`ExecutorService`接口的基本实现框架。`ExecutorService`接口是`Executor`接口的一个扩展,主要负责管理和控制线程的...

    线程池核心组件源码剖析.docx

    在Java中,线程池的核心组件主要包括四个部分:`Executor`接口、`ExecutorService`接口、`AbstractExecutorService`抽象类以及`ThreadPoolExecutor`实现类。此外,`Executors`工具类提供了方便的线程池创建方法。 1...

    Java使用ExecutorService来停止线程服务

    在上面的代码中,我们继承了 AbstractExecutorService 类,并添加了一个 taskCancelledAtShutdown 集合来存储那些已经开始执行但是没有执行完毕的任务。在 execute() 方法中,我们使用 finally 语句来判断任务是否...

    了解Java线程池创建过程

    Java中提供了一个名为Executor框架的线程池管理框架,该框架包括Executor、ExecutorService、AbstractExecutorService和ThreadPoolExecutor等接口和类。Executor是一个基本的接口,提供了execute方法来执行Runnable...

    美团动态线程池实践思路开源项目(DynamicTp),线程池源码解析及通知告警篇.doc

    AbstractExecutorService 抽象类继承 ExecutorService 接口,对 ExecutorService 相关方法提供了默认实现,用 RunnableFuture 的实现类 FutureTask 包装 Runnable 任务,交给 execute() 方法执行,然后可以从该 ...

    高并发编程,高并发编程,高并发编程

    * AbstractExecutorService是Java中的抽象线程池类,提供了execute()和submit()方法的默认实现。 七、高并发编程的其他知识点 * volatile关键字可以确保变量的可见性和原子性。 * synchronized关键字可以确保方法...

    J2SE 1.6所有的类

    在并发编程中,`AbstractExecutorService`是`ExecutorService`的一个抽象实现,提供了管理和控制线程池的方法。`AbstractInterruptibleChannel`代表可以被中断的通道,是NIO的一部分。`AbstractQueuedSynchronizer`...

    深入理解高并发编程-Java线程池核心技术

    线程池中的重要顶层接口和抽象类,如ExecutorService、AbstractExecutorService和ScheduledExecutorService,提供了基础的线程池服务和调度功能。这些接口和抽象类为开发者构建和定制线程池提供了灵活性,可以根据...

    java中文帮助文档[归类].pdf

    5. **并发编程**:AbstractExecutorService、AbstractInterruptibleChannel和AbstractQueuedSynchronizer等类是Java并发库的核心组件,它们支持线程池、通道操作和同步原语。 6. **文档模型**:AbstractDocument...

    徒手实现线程池-1

    - AbstractExecutorService 抽象类进一步简化了 ExecutorService 的实现。 - ThreadPoolExecutor 是具体实现类,负责管理和调度线程。 - ScheduledExecutorService 提供了定时和周期性任务的执行能力。 了解并...

    我的线程池

    在实际应用中,还可以自定义线程池实现,例如继承`AbstractExecutorService`或实现`ExecutorService`接口,以满足特定的业务需求。例如,可以定制线程的优先级、线程的命名规则、异常处理策略等。 总的来说,线程池...

    BATJ面试题汇总及详解65页

    - **创建线程池的方式**:Java中可通过`Executors`工厂类或直接继承`AbstractExecutorService`实现自定义线程池。 - **线程安全问题**:线程安全是指在多线程环境下,代码能够正确处理并发访问,不会导致数据不...

    java Fork Join框架及使用

    ForkJoinPool是这个框架的核心组件,它扩展了AbstractExecutorService类,并实现了工作窃取算法。工作窃取算法允许工作线程在自己的任务队列为空时,从其他线程的任务队列中偷取任务来执行,这样可以更高效地利用...

    java中文帮助文档.pdf

    `AbstractExecutorService`是`ExecutorService`的抽象类,提供了线程池服务的基本实现。`AbstractInterruptibleChannel`是可中断通道的抽象类,允许在读写操作时被中断。`AbstractLayoutCache`和`...

    Randroid类库

    19. **AbstractExecutorService**:提供了ExecutorService执行方法的默认实现,是线程池服务的基础。 20. **AbstractHttpClient**:这是HttpClient的便利基类,用于HTTP客户端的实现,简化了网络请求的处理。 21. ...

    线程池java

    该类继承自`AbstractExecutorService`,实现了线程池的主要功能。 **构造方法详解**: ```java public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, ...

    java.util.concurrent.uml.pdf

    AbstractExecutorService是一个抽象类,实现了ExecutorService接口,并提供了一些默认实现,以便于子类进行更具体的实现。 ThreadPoolExecutor是一个核心的线程池实现,它通过线程池参数配置来管理执行任务。它实现...

    简单谈谈ThreadPoolExecutor线程池之submit方法

    public abstract class AbstractExecutorService implements ExecutorService { ... public &lt;T&gt; Future&lt;T&gt; submit(Callable&lt;T&gt; task) { if (task == null) throw new NullPointerException(); RunnableFuture&lt;T&gt;...

Global site tag (gtag.js) - Google Analytics