线程池第一篇:线程池相关接口

线程池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的可能。

posted on 2019-10-14 21:23  koushr  阅读(413)  评论(0编辑  收藏  举报

导航