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源码中的线程知识的更多相关文章

  1. rxjava源码分析

    RXjava响应式编程 此文作者大暴雨原创,转载请注明出处. 如果线程的知识不是很丰富,请先查看     rxjava源码中的线程知识  一文 rxjava总结就是:异步实现主要是通过扩展观察者模式 ...

  2. ASP.NET MVC Filters 4种默认过滤器的使用【附示例】 数据库常见死锁原因及处理 .NET源码中的链表 多线程下C#如何保证线程安全? .net实现支付宝在线支付 彻头彻尾理解单例模式与多线程 App.Config详解及读写操作 判断客户端是iOS还是Android,判断是不是在微信浏览器打开

    ASP.NET MVC Filters 4种默认过滤器的使用[附示例]   过滤器(Filters)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,不是每个请求都会响 ...

  3. Jquery源码中的Javascript基础知识(三)

    这篇主要说一下在源码中jquery对象是怎样设计实现的,下面是相关代码的简化版本: (function( window, undefined ) { // code 定义变量 jQuery = fun ...

  4. Jquery源码中的Javascript基础知识(一)

    jquery源码中涉及了大量原生js中的知识和概念,文章是我在学习两者的过程中进行的整理和总结,有不对的地方欢迎大家指正. 本文使用的jq版本为2.0.3,附上压缩和未压缩版本地址: http://a ...

  5. Android 网络框架之Retrofit2使用详解及从源码中解析原理

    就目前来说Retrofit2使用的已相当的广泛,那么我们先来了解下两个问题: 1 . 什么是Retrofit? Retrofit是针对于Android/Java的.基于okHttp的.一种轻量级且安全 ...

  6. 访何红辉:谈谈Android源码中的设计模式

    最近Android 6.0版本的源代码开放下载,刚好分析Android源码的技术书籍<Android源码设计模式解析与实战>上市,我们邀请到它的作者何红辉,来谈谈Android源码中的设计 ...

  7. RxJava系列6(从微观角度解读RxJava源码)

    RxJava系列1(简介) RxJava系列2(基本概念及使用介绍) RxJava系列3(转换操作符) RxJava系列4(过滤操作符) RxJava系列5(组合操作符) RxJava系列6(从微观角 ...

  8. Android 源码中的设计模式

    最近看了一些android的源码,发现设计模式无处不在啊!感觉有点乱,于是决定要把设计模式好好梳理一下,于是有了这篇文章. 面向对象的六大原则 单一职责原则 所谓职责是指类变化的原因.如果一个类有多于 ...

  9. MMS源码中异步处理简析

    1,信息数据的查询,删除使用AsycnQueryHandler处理 AsycnQueryHandler继承了Handler public abstract class AsyncQueryHandle ...

随机推荐

  1. Python 字符串反转

    方法一: 切片的方法 a = "hello"b = len(a)i = 1c = ""while i<=b: d = a[b-i] c += d i+=1 ...

  2. adminLTE的自动化菜单

    一. model from django.db import models # Create your models here. class MenuInfo(models.Model): paren ...

  3. Android监听返回键、Home键+再按一次返回键退出应用

    Android监听返回键需重写onKeyDown()方法 Home键keyCode==KeyEvent.KEYCODE_HOME @Override public boolean onKeyDown( ...

  4. Node.js Express 框架 GET方法

    GET 方法 以下实例演示了在表单中通过 GET 方法提交两个参数,我们可以使用 server.js 文件内的 process_get 路由器来处理输入: index.htm 文件代码如下: < ...

  5. 日常开发使用GIT命令

    git是一种分布式的版本管理工具,现在我总结下日常使用的git命令 1)检出 git clone 地址 --检出代码 #这里的地址是代码池的地址,如Github或bitbucket 2)增加文件 gi ...

  6. UVa 10917 Dijkstra

    本来就是水题一道. 题意:一个人要从点1去到点2,中间还有很多点和很多条边.问你如果他每次走的边(a,b)都满足:a点到目标点的最短距离<b点到目标点的最短距离,那么他从点1出发到点2总共有多少 ...

  7. bootstraptable插件文档的坑

    1.事件onCheck中文档参数为row, $element正确的顺序为$element,row eg: $Table.on('check.bs.table', function ($element, ...

  8. SSIS变量属性中EvaluateAsExpression设置的作用

    我们在做SqlServer SSIS包开发的时候,经常会用到SSIS的变量,我们可以使用和修改SSIS变量的值使得SSIS包的逻辑更灵活,如下图所示: 在定义SSIS变量的时候可以使用固定值(如上图中 ...

  9. Oracle数据访问组件ODAC的安装方法

    Oracle数据访问组件ODAC(Oracle Data Access Components)顾名思义就是用来访问Oracle数据库的小程序.我们可以编程调用这些组件来实现在没有安装Oracle数据库 ...

  10. ArcGIS10.1 发布气温插值GP服务

    首先通过ModelBuilder 工具 构建模型 然后通过模块右键 设置输入参数 或者直接将一个模块设为输入参数 在输出模块的右键属性上 可以设置lyr文件用于渲染 设置数据添加到显示用于不是发布的时 ...