API 参考 / capability 包:服务、状态与游玩访问
NetworkAccess
宿主托管的模组专属网络线程池。宿主只负责线程生命周期;协议(TCP/UDP/HTTP、局域网联机、状态广播等)由模组用标准 java.net / java.nio 在该池上自行实现——这是刻意保留的原语边界,宿主不做协议层封装。经 ctx.network() 获取(进程级,任意场景可用)。
方法速览
| 方法 | 用途 |
|---|---|
executor() | 取本模组专属的调度线程池 |
完整签名
java
public interface NetworkAccess {
ScheduledExecutorService executor();
}executor()
签名:
java
ScheduledExecutorService executor();行为:返回本模组专属的调度线程池,支持 scheduleAtFixedRate 等周期任务。
- 按模组懒创建:首次调用才建线程(核心数 4、守护线程、线程名
mod-net-<modId>-N);不使用网络则零开销。同一模组多次调用返回同一实例。 - 宿主在模组停用(含游玩中热停用)与游戏退出时对该池执行
shutdownNow()(中断运行中的任务),并把该能力实例置为终止态。此后再调用executor()抛IllegalStateException(防止已停用模组复活线程池)——不是重建新池;热重载走新的ModContext/ 新的能力实例。 - 本池归宿主所有:模组不要对它调用
shutdown(),也不要把ScheduledExecutorService引用缓存到模组静态字段。 - 阻塞在普通
java.netSocket 上的线程不响应中断,宿主无法强杀;模组应在onUnload中自行关闭自己打开的 socket / 连接,否则残留线程会存活到进程退出(守护线程,不影响游戏退出,但属于资源泄漏)。 - 网络任务如需影响画面,用宿主提供的线程安全入口(
ctx.panels()/ctx.notifier())回交游戏线程渲染。
示例:
java
@Override
public void onInit(ModContext ctx) {
ScheduledExecutorService pool = ctx.network().executor();
pool.execute(() -> {
try (java.net.Socket socket = new java.net.Socket("127.0.0.1", 12345)) {
// ... 收发 ...
} catch (Exception e) {
ctx.getLogger().warning("网络失败:" + e.getMessage());
}
});
}线程:所有阻塞 IO(socket 读写、accept、HTTP 请求)必须在 executor() 返回的线程池上执行;严禁在游戏线程(FX / 渲染线程)做任何阻塞操作,否则整个游戏冻结。
稳定性:2.0 起冻结:2.x 内只增不破。