java8新特性——并行流与串行流

并行流

就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流

java8中将并行进行了优化,我们可以很容易对数据进行并行操作

Stream API可以声明性地通过parallel()与sequential()在并行流与顺序流之间进行切换

在这里插入图片描述

Fork/Join框架与传统线程池的区别

  • 采用“工作窃取”模式:
    • 当执行新的任务时它可以将其拆分分成更小的任务执行,并将小任务加到线程队列中,然后再从一个随机线程的队列中偷一个并把它放在自己的队列中
  • 相对于一般的线程池实现,fork/join框架的优势体现在对其中包含的任务的处理方式上,在一般的线程池中,如果一个线程正在执行的任务由于某些原因无法继续运行,那么该线程会处于等待状态。
  • 而fork/join框架视线中,如果某个子问题由于等待另外一个子问题的完成而无法继续运行。那么处理该子问题的线程会主动寻找其他尚未运行的子问题来执行。这种方式减少了线程的等待时间,提高了性能

原来使用fork-join:

  • 需要继承RecursiveTask父类,重写compute()方法,自己制定分配规则
public class ForkJoin extends RecursiveTask<Long> {

	//比如大数据热搜,全局搜索热搜词,在数据量极高的情况下,使用forkjoin效率高

	private long start;
	private long end;

	private static final long ZERO_AREA = 10000; //临界值

	public ForkJoin(long start, long end) {
		this.start = start;
		this.end = end;

	}

	/*
		把一个大数字拆分,拆一半,拆一半,直到拆到10000为止,在10000范围内累加
	 */

	@Override
	protected Long compute() {

		long length = end - start;

		if (length <= ZERO_AREA) {

			//到达临界值就累加
			long sum = 0;
			for (long i = start; i < end; i++) {
				sum += i;
			}
			return sum;

		} else {
			//不达到临界值,就要拆分
			long middle = (start + end) / 2;
			ForkJoin left = new ForkJoin(start,middle);
			left.fork();//拆分子任务,同时压入线程队列

			ForkJoin right =new  ForkJoin(middle+1,end);
			right.fork();

			return left.join() + right.join();

		}

	}

测试

public static void main(String[] args) {
		Instant start = Instant.now();

		ForkJoinPool pool = new ForkJoinPool();
		ForkJoinTask<Long> task = new ForkJoin(0,5000000000L); //0到五十个亿的累加
		Long sum = pool.invoke(task);

		System.out.println("和为 = " + sum);

		Instant end = Instant.now();
		System.out.println("耗时为:"+Duration.between(start,end).toMillis() + "毫秒");
		//耗时为:3946毫秒
}

java8的并行流

  • 底层还是forkjoin
  • 加个方法parallel()
/**
	 * java8并行流
	 */
	@Test
	public void test(){

		//累加,顺序流
		OptionalLong aLong = LongStream.rangeClosed(0, 10000000L)
				.reduce(Long::sum);


        //累加,并行流,只要加个parallel()就行   底层还是forkjoin
		OptionalLong aLong2 = LongStream.rangeClosed(0, 10000000L)
				.parallel()
				.reduce(Long::sum);
		System.out.println("aLong2 = " + aLong2.getAsLong());

	}

运行的时候可以看一下cup的运行状态,四核CPU全部拉满,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值