zoukankan      html  css  js  c++  java
  • 线程池第一篇:线程池相关接口

    线程池ExecutorService

    线程池用ExecutorService接口表示。ExecutorService继承了Executor接口。Executor接口就只有一个方法void execute(Runnable command),执行任务,没有返回值。

    ExecutorService接口方法有:

    1、submit()的三个重载:

    Future submit(Runnable task):执行Runnable实例。返回值Future实例的get()方法返回值为null。

    Future<T> submit(Runnable task, T result):多出来一个T实例,返回值Future实例的get()方法返回值就是这个T实例。

    Future submit(Callable task):入参是一个Callable实例。Callable接口同Runnable接口类似,都是函数式接口,都只有一个方法。不同的是Runnable的方法没有返回值,无入参无出参,而Callable的方法有返回值,无入参有出参。本submit方法返回的Future实例的get()方法返回值就是Callable实例的返回值。其实效果等同于Future<T> submit(Runnable task, T result)。

    ExecutorService的execute()方法和submit()方法有什么区别?面试题有问过。

    1)execute()方法是从Executor接口继承的,入参只能是Runnable实例,且方法没有返回值,换句话说只能提交没有返回值的任务。

    submit()方法入参既可以是Runnable实例,也可以是Callable实例,返回值是Future类型,既可以提交没有返回值的任务,也可以提交有返回值的任务。

    2)假如任务抛异常,那么用execute提交时,主线程不能获取到这个异常。而用submit提交时,在调用返回值Future实例的get方法时会抛出这个异常,从而可以在主线程中try catch。

    2、invokeAll()的两个重载:

    List<Future<T>> invokeAll(Collection<Callable<T>> tasks):主线程会阻塞,直到所有的Callable实例都执行完。如果某任务很耗时,则主线程一直阻塞。

    List<Future<T>> invokeAll(Collection<Callable<T>> tasks, long timeout, TimeUnit unit):主线程会阻塞,直到所有的Callable实例都执行完或者阻塞到一定时间。

    3、invokeAny()的两个重载:

    T invokeAny(Collection<Callable<T>> tasks):主线程会阻塞,直到某一个Callable实例执行完。如果所有任务都很耗时,则主线程一直阻塞。

    T invokeAny(Collection<Callable<T>> tasks, long timeout, TimeUnit unit):主线程会阻塞,直到某一个Callable实例执行完或者阻塞到一定时间。

    4、void shutdown():关闭线程池。调用此方法后,线程池就不再接受新任务了,把已经接受的任务完成后,线程池就关闭了。

    boolean isShutdown():查看线程池是否已关闭。

    定时任务线程池ScheduledExecutorService

    定时任务线程池用ScheduledExecutorService接口表示。ScheduledExecutorService接口继承了ExecutorService接口。

    ScheduledExecutorService接口方法有:

    1、schedule()方法的两个重载

    ScheduledFuture schedule(Runnable command, long dealy, TimeUnit unit):多少时间之后执行Runnable实例。注意,这里只执行一次。妈的,坑货。

    SchedeledFutrure<T> schedule(Callable<T> callable, long delay, TimeUnit unit):多少时间之后执行Callable实例。这里也是只执行一次。妈耶

    2、ScheduledFuture scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit):多少时间之后每隔多少时间执行一次Runnable实例。哈哈,这个是会一直执行下去的,除非某一次执行抛了异常。我们可以把任务try catch住,这样就真的会一直执行下去了。每次都是从上次开始时间点进行计时。

    3、ScheduledFuture scheduleWithFixedDelay(Runnable command, long initialDelay, long period, TimeUnit unit):多少时间之后方法执行,每次方法执行完之后,多少时间之后方法又一次执行。同样,抛异常会终止定时任务。try catch住任务,就会一直执行下去。每次都是从上次执行结束时间点开始计时。

    问题1:

    如果scheduleAtFixedRate()任务某次执行的时间要超过定时间隔,那么下次任务会并发执行吗?

    答:不会。下一次会misfire,然后等上一次执行完之后立即执行。就像quartz一样,如果执行时间超过quartz间隔,就有misfire的可能。

    ListeningExecutorService

    不是jdk的接口,而是在guava包中,全类名是com.google.common.util.concurrent.ListeningExecutorService,继承了ExecutorService接口。

    ListeningScheduledExecutorService

    同样不是jdk提供,而是guava提供的接口,全类名是com.google.common.util.concurrent.ListeningScheduledExecutorService,继承了ListeningExecutorService接口和ScheduledExecutorService接口。

  • 相关阅读:
    团队开发5
    团队开发4
    团队开发3
    团队开发2
    团队开发1
    团队计划会议
    寒假学习进度---完结篇
    寒假学习进度十七
    寒假学习进度十六
    python后续学习
  • 原文地址:https://www.cnblogs.com/koushr/p/11674252.html
Copyright © 2011-2022 走看看