栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

内部更改限制和无序流

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

内部更改限制和无序流

更改发生在Java 9 beta 103和Java 9 beta
120(JDK‑8154387)之间。

负责的班级是

StreamSpliterators.UnorderedSliceSpliterator.OfInt
,分别。它的超一流
StreamSpliterators.UnorderedSliceSpliterator

该类的旧版本看起来像

abstract static class UnorderedSliceSpliterator<T, T_SPLITR extends Spliterator<T>> {    static final int CHUNK_SIZE = 1 << 7;    // The spliterator to slice    protected final T_SPLITR s;    protected final boolean unlimited;    private final long skipThreshold;    private final AtomicLong permits;    UnorderedSliceSpliterator(T_SPLITR s, long skip, long limit) {        this.s = s;        this.unlimited = limit < 0;        this.skipThreshold = limit >= 0 ? limit : 0;        this.permits = new AtomicLong(limit >= 0 ? skip + limit : skip);    }    UnorderedSliceSpliterator(T_SPLITR s,        UnorderedSliceSpliterator<T, T_SPLITR> parent) {        this.s = s;        this.unlimited = parent.unlimited;        this.permits = parent.permits;        this.skipThreshold = parent.skipThreshold;    }

        @Override        public void forEachRemaining(Consumer<? super T> action) { Objects.requireNonNull(action); ArrayBuffer.OfRef<T> sb = null; PermitStatus permitStatus; while ((permitStatus = permitStatus()) != PermitStatus.NO_MORE) {     if (permitStatus == PermitStatus.MAYBE_MORE) {         // Optimistically traverse elements up to a threshold of CHUNK_SIZE         if (sb == null)  sb = new ArrayBuffer.OfRef<>(CHUNK_SIZE);         else  sb.reset();         long permitsRequested = 0;         do { } while (s.tryAdvance(sb) && ++permitsRequested < CHUNK_SIZE);         if (permitsRequested == 0)  return;         sb.forEach(action, acquirePermits(permitsRequested));     }     else {         // Must be UNLIMITED; let 'er rip         s.forEachRemaining(action);         return;     } }        }

如我们所见,它尝试

CHUNK_SIZE = 1 << 7
在每个分隔器中最多缓冲元素,最终可能以“ CPU核心数”×128个元素结束。

相反,新版本看起来像

abstract static class UnorderedSliceSpliterator<T, T_SPLITR extends Spliterator<T>> {    static final int CHUNK_SIZE = 1 << 7;    // The spliterator to slice    protected final T_SPLITR s;    protected final boolean unlimited;    protected final int chunkSize;    private final long skipThreshold;    private final AtomicLong permits;    UnorderedSliceSpliterator(T_SPLITR s, long skip, long limit) {        this.s = s;        this.unlimited = limit < 0;        this.skipThreshold = limit >= 0 ? limit : 0;        this.chunkSize = limit >= 0 ? (int)Math.min(CHUNK_SIZE, ((skip + limit) / AbstractTask.LEAF_TARGET) + 1) : CHUNK_SIZE;        this.permits = new AtomicLong(limit >= 0 ? skip + limit : skip);    }    UnorderedSliceSpliterator(T_SPLITR s,        UnorderedSliceSpliterator<T, T_SPLITR> parent) {        this.s = s;        this.unlimited = parent.unlimited;        this.permits = parent.permits;        this.skipThreshold = parent.skipThreshold;        this.chunkSize = parent.chunkSize;    }

        @Override        public void forEachRemaining(Consumer<? super T> action) { Objects.requireNonNull(action); ArrayBuffer.OfRef<T> sb = null; PermitStatus permitStatus; while ((permitStatus = permitStatus()) != PermitStatus.NO_MORE) {     if (permitStatus == PermitStatus.MAYBE_MORE) {         // Optimistically traverse elements up to a threshold of chunkSize         if (sb == null)  sb = new ArrayBuffer.OfRef<>(chunkSize);         else  sb.reset();         long permitsRequested = 0;         do { } while (s.tryAdvance(sb) && ++permitsRequested < chunkSize);         if (permitsRequested == 0)  return;         sb.forEach(action, acquirePermits(permitsRequested));     }     else {         // Must be UNLIMITED; let 'er rip         s.forEachRemaining(action);         return;     } }        }

所以现在有一个实例字段

chunkSize
。当存在定义的限制并且表达式的
((skip + limit) /AbstractTask.LEAF_TARGET) +1
计算结果小于时
CHUNK_SIZE
,将使用该较小的值。因此,当限制
chunkSize
较小时,该值会小得多。在您的限制为的情况下
5
,块大小将始终为
1



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/438575.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号