返回值 | 方法 | 说明 |
---|---|---|
int | size() | 集合大小 |
boolean | isEmpty() | 是不是包含元素(return size == 0 ) |
Iteratir | iterator() | 获取迭代器 |
Object[] | toArray() | 转换成Object数组 |
T[] | toArray(T[] a) | 转换成指定类型的数组 |
boolean | add(E e) | 添加元素 |
boolean | remove(Object o) | 删除指定元素 |
boolean | containsAll(Collection<?> c) | 是否包含结合中所有元素 |
boolean | addAll(Collection<? extends E> c ) | 添加集合c中所有元素 |
boolean | removeAll(Collection<?> c ) | 移出包含的c结合中的值 |
default boolean | removeIf(Predicate<? super E> filter ) | 遍历数组移除符合条件的数据(JDK1.8) |
boolean | retainAll(Collection<?> c) | 仅保留此collection中那些也包含在指定collection的元素 |
void clear() | 清空集合 | |
Spliterator | spliterator() | 分割数组(多线程操作JDK1.8) |
Stream | stream() | 流操作(JDK1.8) |
default Stream | parallelStream() | 并行执行的流操作 |
推荐一篇博客 我也是参考 水很深
Java8给ForkJoinPool添加了一个通用的线程池,这个线程池用来处理那些没有被显式提交到任何线程池的任务。他是ForkJoinPool类型上的一个静态元素,他拥有默认线程数量。当调用Arrays类上添加的新方法时(parallelSort ),自动并行化就会发生。
对于ForkJoinPool通用线程池的线程数量,通常使用默认值就可以了,即运行时计算机的数量。
package along;import java.util.ArrayList;import java.util.List;import java.util.Set;import java.util.concurrent.CopyOnWriteArraySet;import java.util.concurrent.CountDownLatch;public class javaTest {public static void main(String[] args) throws Exception { System.out.println("Hello World!");// 构造一个10000个元素的集合 List<Integer> list = new ArrayList<>();for (int i = 0; i < 10000; i++) { list.add(i);}// 统计并行执行list的线程 Set<Thread> threadSet = new CopyOnWriteArraySet<>();// 并行执行 list.parallelStream().forEach(integer -> { Thread thread = Thread.currentThread();// System.out.println(thread);// 统计并行执行list的线程 threadSet.add(thread);}); System.out.println("threadSet一共有" + threadSet.size() + "个线程"); System.out.println("系统一共有" + Runtime.getRuntime().availableProcessors()+ "个cpu"); List<Integer> list1 = new ArrayList<>(); List<Integer> list2 = new ArrayList<>();for (int i = 0; i < 100000; i++) { list1.add(i); list2.add(i);} Set<Thread> threadSetTwo = new CopyOnWriteArraySet<>(); CountDownLatch countDownLatch = new CountDownLatch(2); Thread threadA = new Thread(() -> { list1.parallelStream().forEach(integer -> { Thread thread = Thread.currentThread(); threadSetTwo.add(thread);}); countDownLatch.countDown();}); Thread threadB = new Thread(() -> { list2.parallelStream().forEach(integer -> { Thread thread = Thread.currentThread(); threadSetTwo.add(thread);}); countDownLatch.countDown();}); threadA.start(); threadB.start(); countDownLatch.await(); System.out.print("threadSetTwo一共有" + threadSetTwo.size() + "个线程");}}//threadSet是 4 也就是是3个线程池线程+1个forEach线程本身//threadSetTwo 是5 也就是3个线程池线程+2个forEach线程//所以如果ForkJoinPool需要4个线程 将它的值设置为 3 即可
ParallelStreams 的陷阱
parallelStreams不是万能的 不可乱用!
在这个例子中,我们想同时查询多个搜索引擎并且获得第一个返回的结果。
小结: