在 declare @tab table ([Plan] INT, StartDate DATE, EndDate DATE, [Order] INT )
INSERT INTO @tab VALUES
(1, '2014-01-01', '2014-01-31', 1),(1, '2014-02-01', '2014-02-24', 2),
(1, '2014-02-25', '2014-06-30', 3),(1, '2014-07-07', '2014-08-28', 4),
(1, '2014-09-01', '2014-09-30', 5),(1, '2014-10-01', '2014-12-31', 6)
select [plan], Max(case when ro in (1,4,5) then startDate end) st,
Max(case when ro in (3,4,0) then endDate end) et from (
select *, ([order]-1) / 6 as grp,
[order]%6 as ro, case when ([order] % 6)<4 and ([order] % 6)!=0 then 1
when ([order] % 6)=4 then 2 else 3 end as subgrp
from @tab) t group by [plan],grp,subgrp
网络请求中使用Schedulers.newThread()
与Schedulers.io()
有什么好处。我见过很多使用Retrofit
的例子,但我想了解原因。
示例情况:
io()
VS
observable.onErrorResumeNext(refreshTokenAndRetry(observable))
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())...
我见过的其中一个原因是 -
observable.onErrorResumeNext(refreshTokenAndRetry(observable))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())...
为每个工作单元创建一个新线程。 newThread()
将使用线程池
但该论点对应用程序的影响是什么?还有什么其他方面?
答案 0 :(得分:96)
您是正确的,使用Schedulers.io()
的好处在于它使用线程池,而Schedulers.newThread()
则没有。
您应该考虑使用线程池的主要原因是它们维护了许多空闲且等待工作的预创建线程。这意味着当您完成工作时,您不需要经历创建线程的开销。完成工作后,该线程也可以重新用于将来的工作,而不是不断创建和销毁线程。
创建线程可能很昂贵,因此最大限度地减少动态创建的线程数通常很好。
有关线程池的更多信息,我建议: