并发知识6
2018-08-06 本文已影响1人
奔跑的蛙牛
对并发散列映射的批操作
javase8 为散列映射提供批操作,即使有其他线程在处理映射,这些操作也能安全的执行。
批操作会遍历映射, 处理遍历过程中找到的元素
3种操作
- 搜索为每个键或值提供一个函数, 直到函数生成一个非 null 的结果。然后搜 索终止, 返回这个函数的结果。
- 归约 组合所有键或值, 这里要使用所提供的一个累加函数
- forEach 为所有键或值提供一个函数。
找出第一个出现次数超过1000的单词
String result = map.search(threshold, (k, v) -> v > 1000 ? k : null);
使用foreach遍历
map. forEach ( threshold ,
(k, v) -> v > 1000 ? k + "> " + v : null, // Filter and transformer
System.out::println); // The nulls are not passed to the consumer
使用reduce累加
Long sum = map.reduceValues(threshold, Long::sum);
统计多少个条目的值大于1000
Long count = map.reduceValues(threshold, v -> v > 1000 ? 1L : null ,
Long: : sum) ;
并行数组算法
Arrays.parallelPrefix(values, (x, y) -> x * y)
执行器
构建新的线程有一定的代价,涉及到与操作系统的交互。如果程序中创建大量的生命很短的线程,建议使用线程池
线程池
使用线程池应该做的事
-
调用 Executors 类中静态的方法 newCachedThreadPool 或 newFixedThreadPool
-
调用 submit 提交 Runnable 或 Callable 对象
-
如果想要取消一个任务, 或如果提交 Callable 对象, 那就要保存好返回的 Future 对象。
-
当不再提交任何任务时, 调用 shutdown。
可完成future
可以利用CompletableFuture实现当某一事件发生后执行某个操作,也可以利用它来有顺序的做某件事