java高并发代码示例 java实现高并发

「高并发」两种异步模型与深度解析Future接口-大家好,我是冰河~~
本文有点长,但是满满的干货 , 以实际案例的形式分析了两种异步模型,并从源码角度深度解析Future接口和FutureTask类,希望大家踏下心来 , 打开你的IDE,跟着文章看源码,相信你一定收获不?。?
在Java的并发编程中,大体上会分为两种异步编程模型,一类是直接以异步的形式来并行运行其他的任务 , 不需要返回任务的结果数据 。一类是以异步的形式运行其他任务,需要返回结果 。
1.无返回结果的异步模型
无返回结果的异步任务,可以直接将任务丢进线程或线程池中运行,此时 , 无法直接获得任务的执行结果数据,一种方式是可以使用回调方法来获取任务的运行结果 。
具体的方案是:定义一个回调接口,并在接口中定义接收任务结果数据的方法 , 具体逻辑在回调接口的实现类中完成 。将回调接口与任务参数一同放进线程或线程池中运行,任务运行后调用接口方法,执行回调接口实现类中的逻辑来处理结果数据 。这里,给出一个简单的示例供参考 。
便于接口的通用型 , 这里为回调接口定义了泛型 。
回调接口的实现类主要用来对任务的返回结果进行相应的业务处理 , 这里,为了方便演示,只是将结果数据返回 。大家需要根据具体的业务场景来做相应的分析和处理 。
任务的执行类是具体执行任务的类,实现Runnable接口,在此类中定义一个回调接口类型的成员变量和一个String类型的任务参数(模拟任务的参数),并在构造方法中注入回调接口和任务参数 。在run方法中执行任务,任务完成后将任务的结果数据封装成TaskResult对象,调用回调接口的方法将TaskResult对象传递到回调方法中 。
到这里,整个大的框架算是完成了 , 接下来,就是测试看能否获取到异步任务的结果了 。
在测试类中,使用Thread类创建一个新的线程,并启动线程运行任务 。运行程序最终的接口数据如下所示 。
大家可以细细品味下这种获取异步结果的方式 。这里 , 只是简单的使用了Thread类来创建并启动线程,也可以使用线程池的方式实现 。大家可自行实现以线程池的方式通过回调接口获取异步结果 。
2.有返回结果的异步模型
尽管使用回调接口能够获取异步任务的结果,但是这种方式使用起来略显复杂 。在JDK中提供了可以直接返回异步结果的处理方案 。最常用的就是使用Future接口或者其实现类FutureTask来接收任务的返回结果 。
使用Future接口往往配合线程池来获取异步执行结果 , 如下所示 。
运行结果如下所示 。
FutureTask类既可以结合Thread类使用也可以结合线程池使用,接下来,就看下这两种使用方式 。
结合Thread类的使用示例如下所示 。
运行结果如下所示 。
结合线程池的使用示例如下 。
运行结果如下所示 。
可以看到使用Future接口或者FutureTask类来获取异步结果比使用回调接口获取异步结果简单多了 。注意:实现异步的方式很多,这里只是用多线程举例 。
接下来 , 就深入分析下Future接口 。
1.Future接口
Future是JDK1.5新增的异步编程接口,其源代码如下所示 。
可以看到,在Future接口中,总共定义了5个抽象方法 。接下来,就分别介绍下这5个方法的含义 。
取消任务的执行 , 接收一个boolean类型的参数,成功取消任务 , 则返回true , 否则返回false 。当任务已经完成,已经结束或者因其他原因不能取消时 , 方法会返回false,表示任务取消失败 。当任务未启动调用了此方法,并且结果返回true(取消成功),则当前任务不再运行 。如果任务已经启动,会根据当前传递的boolean类型的参数来决定是否中断当前运行的线程来取消当前运行的任务 。

推荐阅读