多线程
为什么要使用多线程,在这里就不赘述,一句话,就是节约时间的
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