Java多线程11-异步编程

Posted 离不开的深圳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java多线程11-异步编程相关的知识,希望对你有一定的参考价值。


一、同步计算与异步计算

                                       同步计算


                                     异步计算


阻塞:任务的发起线程被暂停,直到任务执行结束

轮询:任务的发起线程不断的检查其发起任务是否执行结束,若结束则执行下一步操作,否则继续检查任务

同步任务执行方式多数情况下意味着阻塞,但它也可能意味着非阻塞(轮询);异步任务执行方式多数情况下意味着非阻塞,但也可能意味着阻塞

 

二、Java Executor框架

Runnable接口和Callable接口都是对任务的处理逻辑的抽象,这种抽象使得我们无须关心任务的具体处理逻辑,Runnable.run()\Callable.call();

Executor接口则是对任务执行进行的抽象,定义如下方法:

void execute(Runnable command)

任务的提交方只需要知道它调用Executor.execute方法便可以使指定任务被执行,而无须关心任务的执行细节;使得任务异步执行还是同步执行有了灵活的变动


Executor接口:

1、只能为客户端代码执行任务,而无法将任务结果返回给客户端代码

2、接口实现类内部往往会维护一个些工作者线程,当不需要Executor实例时,需要主动将维护的工作者线程停掉以释放相应的资源


ExecutorService接口:

1、继承自Executor,用其相同特性

2、定义了submit方法,能接受Callable接口或者Runnable接口表示的任务并返回相应的Future实例,使得提交任务后可以获得执行结果

3、定义了shutdown()和shutdownNow()方法来关闭相应的服务


ThreadPoolExecutor:是ExecutorService的默认实现类


实用工具类Executors

1、能返回默认线程工厂,Executors.defaultThreadFactory()

2、能将Runnable实例转换成Callable实例,Executors.callable()

3、提供返回ExecutorService实例方法:

方法

实用条件及注意实现

newCachedThreadPool()

适合用于执行大量耗时较短且提交频繁的任务

newCachedThreadPool(ThreadFactory  threadFactory)

newFixedThreadPool(int  nThreads)

核心线程池大小等于最大线程池大小,线程不会超时,需主动关闭

newFixedThreadPool(int  nThreads, ThreadFactory threadFactory)

newSingleThreadExecutor()

适合实现单()生产者-单消费者模式

newSingleThreadExecutor(ThreadFactory  threadFactory)

 

异步任务的批量执行:CompletionService

Future<V> submit(Callable<V>task) 获取相应异步任务的处理结果

Future<V> take() throwsInterruptedExeception 获取批量任务的处理结果,与BlockingQueue.take()方法类似,是阻塞的

Future<V> poll(); //非阻塞

Future<V> poll(long timeout, TimeUnitunit)throws InterruptedExeception//非阻塞


ExecutorCompletionService:CompletionService接口实现类

ExecutorService.invokeAll(Collection<? ExtendsCallable<T>> tasks) 批量提交任务,并获取Future实例的列表List

 

三、异步计算助手:FutureTask

Runnable实例来表示异步任务,优点是既可以交个一个专门的工作线程执行也可以交给一个线程池或者Executor的其他实现类来执行;缺点是无法获取任务结果

Callable实例来表示异步任务,优点是能获取任务的处理结果,缺点是只能交给线程池执行

FutureTask则是融合了Runnable接口和Callable接口优点

FutureTask是RunnableFuture接口的实现类,而接口继承了Future及Runnable接口

FutureTask可以将Callable实例转换为Runnable实例

 

AsyncTask抽象类:适用于同一个对象所表示的任务需要被多次执行,并且需要对该任务每次执行结果进行处理;同时实现了Runnable和Callable接口

 

四、计划任务

某些情况下:需要事先提交一个任务,在指定时间或周期性地被执行

ExecutorService接口的子类ScheduledExecutorService接口定义了一组方法用于执行计划任务,其默认实现类为ScheduleThreadPoolExecutor;Executors工具类提供了两个静态工厂方法用于创建实例

Public static ScheduledExecutorServicenewScheduledThreadPool(int corePoolSize)

Public static ScheduledExecutorServicenewScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)


延迟提交任务:

<V> ScheduleFuture<V> schedule(Callable<V>callable, long delay, TimeUnit unit)

ScheduleFuture<?> schedule(Runnablecommand, long delay, TimeUnit unit)


周期性的执行提交任务:

ScheduleFuture<?> scheduleAtFixedRate(Runnablecommand, long initialDelay,long period, TimeUnit unit)

 

 


以上是关于Java多线程11-异步编程的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程编程

JAVA多线程编程之异步

JAVA多线程编程之异步

Java异步编程——深入源码分析FutureTask

Java多线程编程,怎样实现线程间数据的传递?

廖雪峰Java11多线程编程-3高级concurrent包-1ReentrantLock