java8-Stream并行流
基本概念
fork/join框架
在一些情况下,整个任务串行执行消耗的资源非常大,这时我们需要将任务进行拆分(fork)成诸多子任务,同时启动多个cpu进行执行,并对cpu执行工作窃取,再将子任务结果合并(join)为整个任务的结果。
分治算法
根本上将,fork/join为分治算法的一种典型实现,分治算法具体原理,请参见博客园大佬Will_Don的文章
https://www.cnblogs.com/xsyfl/p/6921687.html
工作窃取:
工作窃取算法是指某个线程从其他队列里窃取任务来执行。当我们需要做一个比较大的任务,可以把这个任务分割为若干互不依赖的子任务,为了减少线程间的竞争,把这些子任务分别放到不同的队列里,并为每个队列创建一个单独的线程来执行队列里的任务,线程和队列一一对应。比如A线程负责处理A队列里的任务。
但是,有的线程会先把自己队列里的任务干完,而其他线程对应的队列里还有任务等待处理。干完活的线程与其等着,不如去帮其他线程干活,于是他就去其他线程的队列里窃取一个任务来执行。而在这时他们会访问同一个队列,所以为了减少窃取任务线程和被窃取任务线程之间的竞争,通常会使用双端队列,被窃取任务线程永远从双端队列的头部拿任务执行,而窃取任务的线程永远从双端队列的尾部拿任务执行。
**优点:**充分利用线程进行并行计算,减少了线程间的竞争。
**缺点:**在某些情况下还是存在竞争,比如双端队列里只有一个任务时。并且该算法会消耗了更多的系统资源,比如创建多个线程和多个双端队列。
举个例子
题目:求一到一百亿的和
正常for循环实现
@Test
public void test2(){
Instant start = Instant.now();
Long sum = 0L;
//4068
for (long i = 0; i < 1000000000L; i++) {
sum+=i;
}
System.out.println(sum);
Instant end = Instant.now();
System.o