plugins/languages/java/skills/concurrency/SKILL.md
Java 并发编程规范 — Virtual Threads (JEP 444)、Structured Concurrency (JEP 505)、Scoped Values (JEP 506)、CompletableFuture、java.util.concurrent 工具类、锁策略。当用户编写多线程、异步、并行代码,或讨论 "Virtual Threads"、"虚拟线程"、"并发"、"线程池"、"死锁"、"竞争条件"、"ThreadLocal"、"CompletableFuture"、"async"、"协程" 时加载。
npx skillsauth add lazygophers/ccplugin java-concurrencyInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
适用 Java 21+ (Virtual Threads GA) / Java 25 (Structured Concurrency + Scoped Values GA)。
ReentrantLock 或并发集合ScopedValueCompletableFuture / CountDownLatch / Phasernew Thread().start();用 Executors 或 Thread.ofVirtual()orTimeout / completeOnTimeout)ConcurrentHashMap / CopyOnWriteArrayList,禁 Collections.synchronizedXxx// 推荐:每任务一虚拟线程 executor
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
List<Future<String>> results = urls.stream()
.map(url -> executor.submit(() -> http.get(url)))
.toList();
for (var f : results) handle(f.get());
}
// 工厂方式
Thread.ofVirtual().name("worker-", 0).start(() -> task());
// Spring Boot 3.2+ 启用 (application.yml)
// spring.threads.virtual.enabled: true
适用边界:
// 反例:synchronized 会 pin 虚拟线程
synchronized (lock) { db.query(); }
// 正例:ReentrantLock 不 pin
private final ReentrantLock lock = new ReentrantLock();
lock.lock();
try { db.query(); } finally { lock.unlock(); }
// ShutdownOnFailure:任一失败即取消全部
try (var scope = StructuredTaskScope.open(
StructuredTaskScope.Joiner.<Object>awaitAllSuccessfulOrThrow())) {
var userTask = scope.fork(() -> fetchUser(id));
var ordersTask = scope.fork(() -> fetchOrders(id));
scope.join();
return new Profile(userTask.get(), ordersTask.get());
}
// ShutdownOnSuccess:首个成功即返回
try (var scope = StructuredTaskScope.open(
StructuredTaskScope.Joiner.<String>anySuccessfulResultOrThrow())) {
scope.fork(() -> queryPrimary());
scope.fork(() -> queryReplica());
return scope.join();
}
注:Java 21-24 期间为 incubator,API 经多次重构;Java 25 正式 API 以 Joiner 工厂方法呈现。
private static final ScopedValue<UserContext> USER = ScopedValue.newInstance();
// 绑定 + 运行
ScopedValue.where(USER, currentUser).run(this::handleRequest);
// 读取(仅作用域内可见)
UserContext u = USER.get();
优势:不可变、按作用域出栈自动清理、虚拟线程友好、无内存泄漏风险。
CompletableFuture<User> userF = CompletableFuture.supplyAsync(() -> svc.user(id));
CompletableFuture<List<Order>> ordersF = CompletableFuture.supplyAsync(() -> svc.orders(id));
CompletableFuture<Profile> profile = userF
.thenCombine(ordersF, Profile::new)
.orTimeout(5, TimeUnit.SECONDS)
.exceptionally(ex -> { log.error("profile fail", ex); return Profile.empty(); });
| 场景 | 工具 |
|------|------|
| 线程安全 Map | ConcurrentHashMap + computeIfAbsent |
| 原子引用 | AtomicReference.updateAndGet |
| 等多任务完成 | CountDownLatch 或 Structured Concurrency |
| 限流 | Semaphore |
| 周期任务 | ScheduledExecutorService (禁 Thread.sleep 循环) |
| 生产-消费 | BlockingQueue (LinkedBlockingQueue / ArrayBlockingQueue) |
| AI 易犯解释 | 实际应核验 | |---------|---------| | "传统线程池就够" | I/O 任务是否上 Virtual Threads? | | "synchronized 简单" | 是否会 pin 虚拟线程?换 ReentrantLock | | "ThreadLocal 很方便" | 是否考虑 ScopedValue? | | "fork 就完事" | 是否用 StructuredTaskScope 防泄漏? | | "future 永远 wait" | 是否设 orTimeout? | | "Thread.sleep 等等" | 是否 ScheduledExecutorService? |
orTimeoutspring.threads.virtual.enabled=truejdk.VirtualThreadPinned)tools
--- name: trellisx-workspace description: 维护 `.trellis/task.md` 任务看板 —— trellis 缺的跨任务总览。**一个表格, 一行一个任务**, 列为 id/名称/描述/状态/阶段/进度/worktree (状态/阶段中文显示)。在 task create/start/阶段切换/archive 后**及时更新**对应行; 并**自动清理超 7 天的已完成行**防膨胀。保持看板与 task.json 实时一致。 when_to_use: 维护 / 创建 / 更新 `.trellis/task.md` 任务看板时; task 生命周期任一节点 (create/start/阶段推进/archive) 之后同步看板时; 用户问"当前有哪些任务 / 任务进度 / 任务看板"时。被 trellisx-flow 与 trellisx-apply 注入的流程引用。 user-invocable: true argument-hint: [show|update|sync|cleanup ...] [task id] arguments:
testing
强制以 Trellis task 闭环处理用户指定的请求 (自判新建/并入 → plan→exec→check→finish 全程不跳步)。**仅用户显式主动调用** (/trellisx-flow 或明确要求"强制走 task 处理这个"); **禁止自动 / 被动 / 推断式调用** —— 不要因为某个请求"看起来该建 task"就自动触发本 skill, 那是 apply 注入的 no_task 倾向的职责。
testing
把 强推task + subtask拆分 + worktree隔离 + 闭环收尾 四维度增量注入当前项目 .trellis/ (workflow.md 的 no_task/planning/in_progress 块 + spec 背书文档 + trellis 生命周期 hook worktree 自动化)。强推 task 与闭环为纯 prompt 软约束 (非平台 hook 硬拦截)。**纯增量追加, 绝不替换 trellis 原生文本** (no_task 分类+征同意/check/finish/前缀全保留)。幂等 (marker 包裹)。
development
Claude Code 会话历史整理 — 扫 ~/.claude/projects/**/*.jsonl 全部 session transcripts, 提取学习增量 (用户校正/决策/踩坑/L0 规则) → 全局记忆库 ~/.cortex/.wiki/memory/. 默认 --apply 落盘 (--dry-run opt-in 仅出 JSON plan 预览). 与 cortex-extract (L4-inbox 内部) 互补.