代码拉取完成,页面将自动刷新
同步操作将从 dwing/sharecode 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
import java.util.Arrays;
import java.util.concurrent.locks.LockSupport;
import java.util.concurrent.locks.ReentrantLock;
// java PrimeC2
public class PrimeC2 {
static final Thread.Builder.OfVirtual threadFactory = Thread.ofVirtual();
static final class IntChan {
static final class ThreadValueNode {
final Thread thread = Thread.currentThread();
int value;
}
private final ReentrantLock lock = new ReentrantLock();
private ThreadValueNode[] waitNodes = new ThreadValueNode[2];
private int waitCount;
private boolean hasValue;
private ThreadValueNode addWaitQueue() {
var i = waitCount;
if (i == waitNodes.length)
waitNodes = Arrays.copyOf(waitNodes, i + i);
var node = new ThreadValueNode();
waitNodes[i] = node;
waitCount = i + 1;
return node;
}
private ThreadValueNode pollWaitNode() {
var n = waitCount;
if (n == 0)
return null;
waitCount = --n;
return waitNodes[n];
}
void put(int v) {
lock.lock();
if (!hasValue) {
var node = pollWaitNode();
if (node != null) {
lock.unlock();
node.value = v;
LockSupport.unpark(node.thread);
return;
}
hasValue = true;
}
addWaitQueue().value = v;
lock.unlock();
LockSupport.park();
}
int take() {
lock.lock();
if (hasValue) {
var node = pollWaitNode();
if (node != null) {
lock.unlock();
LockSupport.unpark(node.thread);
return node.value;
}
hasValue = false;
}
var node = addWaitQueue();
lock.unlock();
int v;
do {
LockSupport.park();
v = node.value;
} while (v == 0); // 这里需要判断value的有效性,因为有时会出现park不暂停的情况(可能被其它某处unpark过)
return v;
}
}
static void go(Runnable r) {
threadFactory.start(r);
}
static void generate(IntChan ch) {
try {
//noinspection InfiniteLoopStatement
for (int i = 2; ; i++)
ch.put(i);
} catch (Exception e) {
//noinspection CallToPrintStackTrace
e.printStackTrace();
}
}
static void filter(IntChan in, IntChan out, int prime) {
try {
//noinspection InfiniteLoopStatement
for (; ; ) {
var i = in.take();
if (i % prime != 0)
out.put(i);
}
} catch (Exception e) {
//noinspection CallToPrintStackTrace
e.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 CallToPrintStackTrace
e.printStackTrace();
}
});
Thread.sleep(1_000_000L);
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。