同步操作将从 dwing/sharecode 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
import java.lang.invoke.MethodHandles;import java.lang.invoke.VarHandle;import java.util.concurrent.ForkJoinPool;import java.util.concurrent.locks.LockSupport;// java PrimeC5public class PrimeC5 {static final Thread.Builder.OfVirtual threadFactory = Thread.ofVirtual();static class TransferQueue<E> {static final class QNode implements ForkJoinPool.ManagedBlocker {private static final VarHandle QITEM;private static final VarHandle QNEXT;private static final VarHandle QWAITER;static {try {MethodHandles.Lookup l = MethodHandles.lookup();QITEM = l.findVarHandle(QNode.class, "item", Object.class);QNEXT = l.findVarHandle(QNode.class, "next", QNode.class);QWAITER = l.findVarHandle(QNode.class, "waiter", Thread.class);} catch (ReflectiveOperationException e) {throw new ExceptionInInitializerError(e);}}volatile QNode next; // next node in queuevolatile Object item; // CAS'ed to or from nullvolatile Thread waiter; // to control park/unparkfinal boolean isData;QNode(Object item, boolean isData) {this.item = item;this.isData = isData;}boolean casNext(QNode val) {return next == null && QNEXT.compareAndSet(this, (QNode)null, val);}boolean casItem(Object cmp, Object val) {return item == cmp && QITEM.compareAndSet(this, cmp, val);}/*** Returns true if this node is known to be off the queue* because its next pointer has been forgotten due to* an advanceHead operation.*/boolean isOffList() {return next == this;}void forgetWaiter() {QWAITER.setOpaque(this, null);}boolean isFulfilled() {Object x;return isData == ((x = item) == null) || x == this;}@Overridepublic boolean isReleasable() {Object x;return isData == ((x = item) == null) || x == this || Thread.currentThread().isInterrupted();}@Overridepublic boolean block() {while (!isReleasable())LockSupport.park();return true;}}private static final VarHandle QHEAD;private static final VarHandle QTAIL;static {try {MethodHandles.Lookup l = MethodHandles.lookup();QHEAD = l.findVarHandle(TransferQueue.class, "head", QNode.class);QTAIL = l.findVarHandle(TransferQueue.class, "tail", QNode.class);} catch (ReflectiveOperationException e) {throw new ExceptionInInitializerError(e);}}transient volatile QNode head;transient volatile QNode tail;TransferQueue() {QNode h = new QNode(null, false); // initialize to dummy node.head = h;tail = h;}/*** Tries to cas nh as new head; if successful, unlink* old head's next node to avoid garbage retention.*/void advanceHead(QNode h, QNode nh) {if (h == head && QHEAD.compareAndSet(this, h, nh))h.next = h; // forget old next}/*** Tries to cas nt as new tail.*/void advanceTail(QNode t, QNode nt) {if (tail == t)QTAIL.compareAndSet(this, t, nt);}/*** @see java.util.concurrent.SynchronousQueue.TransferQueue#transfer*/@SuppressWarnings({"unchecked", "JavadocReference"})E transfer(E e) {QNode s = null; // constructed/reused as neededfor (boolean isData = e != null; ; ) {QNode h = head, t = tail, m, tn; // m is node to fulfillif (h == t || t.isData == isData) { // empty or same-mode//noinspection StatementWithEmptyBodyif (t != tail) // inconsistent;else if ((tn = t.next) != null) // lagging tailadvanceTail(t, tn);else if (t.casNext(s != null ? s : (s = new QNode(e, isData)))) {advanceTail(t, s);Thread w = Thread.currentThread();int stat = -1; // same idea as TransferStackObject item;while ((item = s.item) == e) {if ((item = s.item) != e)break; // recheckif (stat <= 0) {if (t.next == s) {if (stat < 0 && t.isFulfilled()) {stat = 0; // yield once if firstThread.yield();} else {stat = 1;s.waiter = w;}}} else {LockSupport.setCurrentBlocker(this);try {ForkJoinPool.managedBlock(s);} catch (InterruptedException cannotHappen) {}LockSupport.setCurrentBlocker(null);}}if (stat == 1)s.forgetWaiter();if (!s.isOffList()) { // not already unlinkedadvanceHead(t, s); // unlink if headif (item != null) // and forget fieldss.item = s;}return item != null ? (E)item : e;}} else if ((m = h.next) != null && t == tail && h == head) {Object x = m.item;boolean fulfilled = ((isData == (x == null)) && x != m && m.casItem(x, e));advanceHead(h, m); // (help) dequeueif (fulfilled) {Thread waiter;if ((waiter = m.waiter) != null)LockSupport.unpark(waiter);return x != null ? (E)x : e;}}}}}static final class IntChan extends TransferQueue<Integer> {void put(int v) {transfer(v);}int take() {return transfer(null);}}static void go(Runnable r) {threadFactory.start(r);}static void generate(IntChan ch) {try {//noinspection InfiniteLoopStatementfor (int i = 2; ; i++)ch.put(i);} catch (Exception e) {//noinspection CallToPrintStackTracee.printStackTrace();}}static void filter(IntChan in, IntChan out, int prime) {try {//noinspection InfiniteLoopStatementfor (; ; ) {var i = in.take();if (i % prime != 0)out.put(i);}} catch (Exception e) {//noinspection CallToPrintStackTracee.printStackTrace();}}public static void main(String[] args) throws InterruptedException {var count = args.length > 0 ? Integer.parseInt(args[0]) : 10000;go(() -> {var ch = new IntChan();var ch0 = ch;go(() -> generate(ch0));try {for (int i = 0; ; ) {var prime = ch.take();if (++i == count) {System.out.println(prime);System.exit(0);}var ch1 = ch;var ch2 = new IntChan();go(() -> filter(ch1, ch2, prime));ch = ch2;}} catch (Exception e) {//noinspection CallToPrintStackTracee.printStackTrace();}});Thread.sleep(1_000_000L);}}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。