rxjava源码中的线程知识
rxjava源码中的线程知识
rx的最精简的总结就是:异步
这里说一下以下的五个类
1.Future
2.ConcurrentLinkedQueue
3.volatile关键字
4.AtomicReference
5.ScheduledExecutorService
一.Future类
1.Future的唯一实现类是FutureTask。
2.这样就可以把Callable放到FutureTask。然后用FutureTask可以Thread thread = new Thread(futureTask)放到thread。
FutureTask<Integer> futureTask = new FutureTask<Integer>(task);
4.Callable就是比runable多了个返回值。
作用
1)判断任务是否完成;
2)能够中断任务;
3)能够获取任务执行结果。
public void test(){
ExecutorService executor = Executors.newCachedThreadPool();创建一个线程池
Task task = new Task();创建一个Callable
Future<Integer> result = executor.submit(task);Callable注册一下
executor.shutdown();挂起线程池
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
System.out.println("主线程在执行任务");
try {
System.out.println("task运行结果"+result.get());//获取线程结果,阻塞的
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println("所有任务执行完毕");
}
class Task implements Callable<Integer>{
@Override
public Integer call() throws Exception {
System.out.println("子线程在进行计算");
Thread.sleep(3000);
int sum = 0;
for(int i=0;i<100;i++)
sum += i;
return sum;
}
}
二.ScheduledExecutorService类
ScheduledExecutorService类继承ExecutorService,定时线程池。可以执行Callable和runable。
常用三个方法
1.schedule(task,initDelay):安排所提交的Callable或Runnable任务在initDelay指定的时间后执行。
2.scheduleAtFixedRate():安排所提交的Runnable任务按指定的间隔重复执行
3.scheduleWithFixedDelay():安排所提交的Runnable任务在每次执行完后,等待delay所指定的时间后重复执行。
这个类比较简单,不举例说明了
三.ConcurrentLinkedQueue类
ConcurrentLinkedQueue是一个基于链接节点的无界线程安全队列
这篇文章已经写得很详细了http://www.infoq.com/cn/articles/ConcurrentLinkedQueue/
四.volatile关键字,易失性变量
volatile和synchronized是实现线程安全的,volatile 变量可以被看作是一种 “程度较轻的 synchronized,Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性.
使用volatile要具备以下两个条件,例如i++这种事不适用的。
1.对变量的写操作不依赖于当前值。
2.该变量没有包含在具有其他变量的不变式中。
详细请查看:http://www.ibm.com/developerworks/cn/java/j-jtp06197.html
五.AtomicReference
AtomicReference的实现其实就是=volatile+cas,这是我的粗略见解
首先volatile是有可见性的,但是没有原子性,这样子对变量的写操作必须不依赖于当前值,如果依赖了当前值怎么办,好了这里就加入了cas操作,可以先判断先判断变量是否被其他线程操作过,再进行更新赋值。当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由JVM从等待队列中选择一个另一个线程进入。这样就不会中断线程。
AtomicReference函数列表
使用 null 初始值创建新的 AtomicReference。
AtomicReference()
使用给定的初始值创建新的 AtomicReference。
AtomicReference(V initialValue)
如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。
boolean compareAndSet(V expect, V update)
// 获取当前值。
V get()
以原子方式设置为给定值,并返回旧值。
V getAndSet(V newValue)
最终设置为给定值。
void lazySet(V newValue)
设置为给定值。
void set(V newValue)
返回当前值的字符串表示形式。
String toString()
如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。
boolean weakCompareAndSet(V expect, V update)
rxjava源码中的线程知识的更多相关文章
- rxjava源码分析
RXjava响应式编程 此文作者大暴雨原创,转载请注明出处. 如果线程的知识不是很丰富,请先查看 rxjava源码中的线程知识 一文 rxjava总结就是:异步实现主要是通过扩展观察者模式 ...
- ASP.NET MVC Filters 4种默认过滤器的使用【附示例】 数据库常见死锁原因及处理 .NET源码中的链表 多线程下C#如何保证线程安全? .net实现支付宝在线支付 彻头彻尾理解单例模式与多线程 App.Config详解及读写操作 判断客户端是iOS还是Android,判断是不是在微信浏览器打开
ASP.NET MVC Filters 4种默认过滤器的使用[附示例] 过滤器(Filters)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,不是每个请求都会响 ...
- Jquery源码中的Javascript基础知识(三)
这篇主要说一下在源码中jquery对象是怎样设计实现的,下面是相关代码的简化版本: (function( window, undefined ) { // code 定义变量 jQuery = fun ...
- Jquery源码中的Javascript基础知识(一)
jquery源码中涉及了大量原生js中的知识和概念,文章是我在学习两者的过程中进行的整理和总结,有不对的地方欢迎大家指正. 本文使用的jq版本为2.0.3,附上压缩和未压缩版本地址: http://a ...
- Android 网络框架之Retrofit2使用详解及从源码中解析原理
就目前来说Retrofit2使用的已相当的广泛,那么我们先来了解下两个问题: 1 . 什么是Retrofit? Retrofit是针对于Android/Java的.基于okHttp的.一种轻量级且安全 ...
- 访何红辉:谈谈Android源码中的设计模式
最近Android 6.0版本的源代码开放下载,刚好分析Android源码的技术书籍<Android源码设计模式解析与实战>上市,我们邀请到它的作者何红辉,来谈谈Android源码中的设计 ...
- RxJava系列6(从微观角度解读RxJava源码)
RxJava系列1(简介) RxJava系列2(基本概念及使用介绍) RxJava系列3(转换操作符) RxJava系列4(过滤操作符) RxJava系列5(组合操作符) RxJava系列6(从微观角 ...
- Android 源码中的设计模式
最近看了一些android的源码,发现设计模式无处不在啊!感觉有点乱,于是决定要把设计模式好好梳理一下,于是有了这篇文章. 面向对象的六大原则 单一职责原则 所谓职责是指类变化的原因.如果一个类有多于 ...
- MMS源码中异步处理简析
1,信息数据的查询,删除使用AsycnQueryHandler处理 AsycnQueryHandler继承了Handler public abstract class AsyncQueryHandle ...
随机推荐
- Drawable和Bitmap区别
Bitmap - 称作位图,一般位图的文件格式后缀为bmp,当然编码器也有很多如RGB565.RGB888.作为一种逐像素的显示对象执行效率高,但是缺点也很明显存储效率低.我们理解为一种存储对象比较好 ...
- 「JavaScript」四种跨域方式详解
超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...
- jQuery对json快速赋值
jQuery对json快速赋值,重点在于将input的id取跟JSON同样的名称. <!DOCTYPE html> <html> <head lang="en& ...
- 常用的yum命令
linux各发行版有多种包管理机制,下面介绍基于RedHat系的yum包管理命令: yum -y install xxx 无需询问,安装xxx包 yum list ...
- 关于eclipse的一些配置
在linux中打开的一刹那,第一感觉就是这货怎么这么丑,用的时候还发现,这货怎么这么慢. 可以通过使用GTK2来让它的图标显示得合理一些,可以调整内存的限制来减少fullGC的次数. 配置文件的路径: ...
- System.UnauthorizedAccessException Access to the path "/etc/mono/registry" is denied.
sudo mkdir /etc/mono/registry sudo mkdir /etc/mono/registry/LocalMachine sudo chmod g+rwx /etc/mono/ ...
- 页面Button/Link 传参数
很多情况下,我们需要在一个标准的页面上添加一个button 或者 是Link, 在点击的过程中想把,一些参数传值到另外一个自定义的页面: 下面这个例子说明是如何操作的 如下图所示,是创建另一个Obje ...
- VS2010无法调试问题解决
最近,因为公司开发的需要,对开发环境进行全面的升级,在这其中也遇到了不少问题,在之后将陆续整理出来,以便以后查看. 之前开发环境:VS2008,ArcGIS9.3,ArcEngine9.3,Oracl ...
- 移动端接口:java写get方式访问数据(springmvc+spring。。。)
很多时候,一个问题想明白,找对点了再去问,这样被问的人也知道怎么给你讲,你也听的明白. 就比如做移动端接口,上去就问 怎么弄接口呀,其实是没找到主要的点上,所以不知道怎么弄,那个点就是手机接口是干嘛的 ...
- js正则表达式
正则表达式分析页面:https://regexper.com/ 可以很清楚的分析正则,加深理解 var reg=/\bis\b/; 'He is a boy.This is a dog.Where i ...