LanAnY
这种写法可不可以算一个异步处理事件?如果算的话,为何我这个取消事件的没有被执行到?

洞穴夜莺
你这是来搞笑的吗?
异步的意义何在?
取消的目的就是阻止进一步处理
然而你异步的话主线程是继续在处理事情的
那你异步取消事件就没有意义

LanAnY
洞穴夜莺 发表于 2020-9-12 20:06
你这是来搞笑的吗?
异步的意义何在?
取消的目的就是阻止进一步处理

那如果这样呢?

洞穴夜莺

不能
不能异步处理游戏对象

LanAnY
洞穴夜莺 发表于 2020-9-12 20:14
不能
不能异步处理游戏对象

请问游戏对象是不是我图片中这个紫色字体有下划线的这个?

洞穴夜莺
本帖最后由 洞穴夜莺 于 2020-9-12 20:32 编辑
GhostSkyV9 发表于 2020-9-12 20:22
请问游戏对象是不是我图片中这个紫色字体有下划线的这个?

是的,除了极个别对象可以在别的线程操作
大部分的对象都必须主线程操作
收包需要在网络线程操作

William_Shi
洞穴夜莺 发表于 2020-9-12 20:23
是的,除了极个别对象可以在别的线程操作
大部分的对象都必须主线程操作
收包需要在网络线程操作 ...

inventory只读可能没问题?
sendMessage异步我记得好像是没问题的
代码不完整也不知道有没有注意线程安全

洞穴夜莺
本帖最后由 洞穴夜莺 于 2020-9-12 21:23 编辑
William_Shi 发表于 2020-9-12 21:16
inventory只读可能没问题?
sendMessage异步我记得好像是没问题的
代码不完整也不知道有没有注意线程安全 ...

sendMessage确实可以在非主线程操作
inventory只读就不清楚了,但我想大概会出问题(需要验证)
抱歉我只是看到操作Inventory就想到线程不安全,没有想过只读可写的问题

QiuJay
我讲个故事:
一个科学家正在做着实验,突然跟助理说:你去帮我办一件事。然后这个助理就去处理你吩咐他的事去了,而你继续着你的实验,直到完成。但是,当你完成实验的这个时间里,去办事的助理发现这个实验不能继续下去了,当他告诉你时,却发现你的实验已经做完了。

mr2044154518
用Callable返回执行结果然后cancel

William_Shi
QiuJay 发表于 2020-9-16 10:56
我讲个故事:
一个科学家正在做着实验,突然跟助理说:你去帮我办一件事。然后这个助理就去处理你吩咐他的 ...

比喻很恰当。具体地来说就是
MC服务端底层,某些计算将要发生了
此时对应的“事件”被触发
于是各个插件依次地排队,按照顺序,一个一个的判断要不要cancel掉事件
你的插件说,排在后面的先来吧,我异步处理
所有插件处理完了,MC服务端进行完了计算,“事件”本身发生了
此时你的插件说等等我,取消事件
有用吗?

柳雪骞
用 Future类 来实现取消会好点。
原代码的事件执行完了,取消作用在了已经结束的任务上。

逍遥梦天
不能
不能异步处理游戏对象

逍遥梦天
不能
不能异步处理游戏对象

mzmzmz
异步调用sendMessage是有可能出问题的

洞穴夜莺
mzmzmz 发表于 2020-10-21 20:00
异步调用sendMessage是有可能出问题的

没有问题,原版就有非主线程发消息的行为

William_Shi
mzmzmz 发表于 2020-10-21 20:00
异步调用sendMessage是有可能出问题的

不可能。
在海螺螺大佬的《如何问玩家‘吾与徐公孰美’》这篇教程里明确提出发送消息是线程安全的。

根据一篇写的很不错的文档(这篇文档对水桶的 scheduler 有较为详细的介绍),这几个东西是线程安全的:


sendMessage (发包)

Bukkit 的 scheduler 包

PluginManager#callEvent(event)


因此应该将注册事件部分的代码通过 Scheduler 转移到主线程完成。


文章:https://www.mcbbs.net/forum.php?mod=viewthread&tid=958674

第一页 上一页 下一页 最后一页