java高并发代码示例 java实现高并发( 四 )


可以看到,report()方法的实现比较简单,首先,将outcome数据赋值给x变量,接下来 , 主要是判断接收到的任务状态,如果状态为NORMAL , 则将x强转为泛型类型返回;当任务的状态大于或者等于CANCELLED , 也就是任务已经取消,则抛出CancellationException异常,其他情况则抛出ExecutionException异常 。
至此,get()方法分析完成 。注意:一定要理解get()方法的实现,因为get()方法是我们使用Future接口和FutureTask类时,使用的比较频繁的一个方法 。
(6)set()方法与setException()方法
继续看FutureTask类的代码,接下来看到的是set()方法与setException()方法,如下所示 。
通过源码可以看出,set()方法与setException()方法整体逻辑几乎一样,只是在设置任务状态时一个将状态设置为NORMAL,一个将状态设置为EXCEPTIONAL 。
至于finishCompletion()方法,前面已经分析过 。
(7)run()方法与runAndReset()方法
接下来 , 就是run()方法了,run()方法的源代码如下所示 。
可以这么说,只要使用了Future和FutureTask,就必然会调用run()方法来运行任务,掌握run()方法的流程是非常有必要的 。在run()方法中,如果当前状态不是NEW , 或者CAS操作返回的结果为false,则直接返回,不再执行后续逻辑,如下所示 。
接下来 , 在try代码块中,将成员变量callable赋值给一个临时变量c,判断临时变量不等于null,并且任务状态为NEW , 则调用Callable接口的call()方法,并接收结果数据 。并将ran变量设置为true 。当程序抛出异常时,将接收结果的变量设置为null,ran变量设置为false,并且调用setException()方法将任务的状态设置为EXCEPTIONA 。接下来 , 如果ran变量为true,则调用set()方法,如下所示 。
接下来 , 程序会进入finally代码块中,如下所示 。
这里,将runner设置为null , 如果任务的当前状态大于或者等于INTERRUPTING,也就是线程被中断了 。则调用handlePossibleCancellationInterrupt()方法,接下来,看下handlePossibleCancellationInterrupt()方法的实现 。
可以看到,handlePossibleCancellationInterrupt()方法的实现比较简单,当任务的状态为INTERRUPTING时,使用while()循环 , 条件为当前任务状态为INTERRUPTING,将当前线程占用的CPU资源释放 , 也就是说,当任务运行完成后,释放线程所占用的资源 。
runAndReset()方法的逻辑与run()差不多,只是runAndReset()方法会在finally代码块中将任务状态重置为NEW 。runAndReset()方法的源代码如下所示 , 就不重复说明了 。
(8)removeWaiter()方法
removeWaiter()方法中主要是使用自旋循环的方式来移除WaitNode中的线程,比较简单,如下所示 。
最后,在FutureTask类的最后,有如下代码 。
关于这些代码的作用,会在后续深度解析CAS文章中详细说明 , 这里就不再探讨 。
至此,关于Future接口和FutureTask类的源码就分析完了 。
好了,今天就到这儿吧 , 我是冰河,我们下期见~~
java高并发?1、在java中java高并发代码示例,高并发属于一种编程术语 , 意思就是有很多用户在访问,导致系统数据不正确、糗事数据java高并发代码示例的现象 。并发就是可以使用多个线程或进程 , 同时处理不同java高并发代码示例的操作 。2、处理高并发java高并发代码示例的方法
对于一些大型网站,比如门户网站,在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器 。

推荐阅读