多线程

为什么要使用多线程,在这里就不赘述,一句话,就是节约时间的

  Observable.just("asdsa", "SDSDS", "SSSSSSSS", "SSSSSSSSSS", "SSSSSSSSSSS").map {
            Thread.sleep(1000)
            it
        }.subscribeOn(Schedulers.newThread()).subscribe { println("This letter is $it") }
        Observable.just(1, 2, 3, 4, 5, 5, 6, 9, 7, 8).subscribeOn(Schedulers.newThread()).map {
            Thread.sleep(1000)
            it
        }.subscribe { println("HHHH is $it") }
        Thread.sleep(10_000)

看见没有,这个用在两个线程中,能够同时运行, 只要你用subscribeOn方法进行线程设置

保持应用运行状态

如果你运行在一般的main函数里面,你则需要考虑这个问题,这里一般由两种方法,一个全局的,一个是局部的

Thread.sleep(Long.MAX_VALUE)
  • blockingSubscribe

在这个订阅没有完成时,整个线程是不会结束的

Observable.just(1, 2, 3, 4, 5, 5, 6, 9, 7, 8).subscribeOn(Schedulers.newThread()).map {
            Thread.sleep(1000)
            it
        }.blockingSubscribe { println("HHHH is $it") }

Schedulers

许多默认的Scheduler 都是通过Schedulers中的静态方法创建的,可以理解是Scheduler集装箱

  • computation

主要是执行一些计算工作,如数学,算法,复杂逻辑,如果你无法判断你的程序会使用哪个作为默认线程,这是个不错的选择

  • IO

主要是那些耗时但不好cpu的工作,如读写数据库,网络请求,磁盘读写等功能。

  • newThread

为每一个订阅新建一个线程,并没有在线程池中,他随着订阅任务的完成而消亡,所以不能重用。

  • Single

在线程池里面,普通的线程

ExecutorService

线程池创建者,可以创建 Scheduler,这就给你很大的随意性,而优点就是不会像newthread 一样只创建不放在线程池,没有维护

 var ser: ExecutorService = Executors.newFixedThreadPool(10)
        var sch = Schedulers.from(ser)
        Observable.just("A", "B").subscribeOn(sch).subscribe { println("The letter is $it") }

开始结束Schedulers

针对某特定的Scheduler 直接调用start,shutdown方法就行了,要想对全部的Scheduler进行操作,调用Schedulers.start,shutdown 就ok

results matching ""

    No results matching ""