这种写法可不可以算一个异步处理事件?如果算的话,为何我这个取消事件的没有被执行到?
你这是来搞笑的吗?
异步的意义何在?
取消的目的就是阻止进一步处理
然而你异步的话主线程是继续在处理事情的
那你异步取消事件就没有意义
异步的意义何在?
取消的目的就是阻止进一步处理
然而你异步的话主线程是继续在处理事情的
那你异步取消事件就没有意义
洞穴夜莺 发表于 2020-9-12 20:14
不能
不能异步处理游戏对象
请问游戏对象是不是我图片中这个紫色字体有下划线的这个?
本帖最后由 洞穴夜莺 于 2020-9-12 20:32 编辑
是的,除了极个别对象可以在别的线程操作
大部分的对象都必须主线程操作
收包需要在网络线程操作
GhostSkyV9 发表于 2020-9-12 20:22
请问游戏对象是不是我图片中这个紫色字体有下划线的这个?
是的,除了极个别对象可以在别的线程操作
大部分的对象都必须主线程操作
收包需要在网络线程操作
洞穴夜莺 发表于 2020-9-12 20:23
是的,除了极个别对象可以在别的线程操作
大部分的对象都必须主线程操作
收包需要在网络线程操作 ...
inventory只读可能没问题?
sendMessage异步我记得好像是没问题的
代码不完整也不知道有没有注意线程安全
本帖最后由 洞穴夜莺 于 2020-9-12 21:23 编辑
sendMessage确实可以在非主线程操作
inventory只读就不清楚了,但我想大概会出问题(需要验证)
抱歉我只是看到操作Inventory就想到线程不安全,没有想过只读可写的问题
William_Shi 发表于 2020-9-12 21:16
inventory只读可能没问题?
sendMessage异步我记得好像是没问题的
代码不完整也不知道有没有注意线程安全 ...
sendMessage确实可以在非主线程操作
inventory只读就不清楚了,但我想大概会出问题(需要验证)
抱歉我只是看到操作Inventory就想到线程不安全,没有想过只读可写的问题
我讲个故事:
一个科学家正在做着实验,突然跟助理说:你去帮我办一件事。然后这个助理就去处理你吩咐他的事去了,而你继续着你的实验,直到完成。但是,当你完成实验的这个时间里,去办事的助理发现这个实验不能继续下去了,当他告诉你时,却发现你的实验已经做完了。
一个科学家正在做着实验,突然跟助理说:你去帮我办一件事。然后这个助理就去处理你吩咐他的事去了,而你继续着你的实验,直到完成。但是,当你完成实验的这个时间里,去办事的助理发现这个实验不能继续下去了,当他告诉你时,却发现你的实验已经做完了。
用Callable返回执行结果然后cancel
QiuJay 发表于 2020-9-16 10:56
我讲个故事:
一个科学家正在做着实验,突然跟助理说:你去帮我办一件事。然后这个助理就去处理你吩咐他的 ...
比喻很恰当。具体地来说就是
MC服务端底层,某些计算将要发生了
此时对应的“事件”被触发
于是各个插件依次地排队,按照顺序,一个一个的判断要不要cancel掉事件
你的插件说,排在后面的先来吧,我异步处理
所有插件处理完了,MC服务端进行完了计算,“事件”本身发生了
此时你的插件说等等我,取消事件
有用吗?
用 Future类 来实现取消会好点。
原代码的事件执行完了,取消作用在了已经结束的任务上。
原代码的事件执行完了,取消作用在了已经结束的任务上。
不能
不能异步处理游戏对象
不能异步处理游戏对象
不能
不能异步处理游戏对象
不能异步处理游戏对象
异步调用sendMessage是有可能出问题的
mzmzmz 发表于 2020-10-21 20:00
异步调用sendMessage是有可能出问题的
没有问题,原版就有非主线程发消息的行为
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