以tpa为例,延时120秒后会取消掉请求,并发送给玩家一条消息:请求已超时
那怎么做到延时执行代码呢,而且不要堵塞主线程
求带佬们解答
那怎么做到延时执行代码呢,而且不要堵塞主线程
求带佬们解答
疾风暗影 发表于 2020-4-24 07:38
Bukkit.getScheduler().runTaskLater
https://hub.spigotmc.org/javadocs/spigot/org/bukkit/scheduler/Bu ...
在文档里看到个异步的方法:runTaskLaterAsynchronously()
那这个runTaskLater会堵塞主线程吗
3079655185 发表于 2020-4-24 08:08
在文档里看到个异步的方法:runTaskLaterAsynchronously()
那这个runTaskLater会堵塞主线程吗 ...
既然是异步了,为什么会堵塞主线程呢?
mangiare 发表于 2020-4-24 08:09
既然是异步了,为什么会堵塞主线程呢?
我问的是runTaskLater会不会堵塞主线程...
另外问下,刚刚看到了这个代码
- Player p = 获取玩家;
- new BukkitRunnable(){
- @Override
- public static void run(){
- 处理代码省略
- p.sendMessage("已超时");
- }
- }.runTaskLaterAsynchronously(this, 2400) ;
这样是不是也可以做到120秒后给玩家发送一条消息。
另外问个我不太懂的问题,new BukkitRunnable()里面的这个p会不会随着上面的p变化啊。
就是比如两个玩家:A玩家和B玩家
A玩家输入了指令,插件运行上面的代码;在A玩家超时之前,B玩家输入指令,插件运行了上面的代码。
那最后会不会两条sendMessage都发给了B玩家
3079655185 发表于 2020-4-24 08:22
我问的是runTaskLater会不会堵塞主线程...
另外问下,刚刚看到了这个代码
谁执行这条命令,p就是谁咯
3079655185 发表于 2020-4-24 08:22
我问的是runTaskLater会不会堵塞主线程...
另外问下,刚刚看到了这个代码
你既然调用了p.sendMessage就不要runTaskLaterAsynchronously,只能runTaskLater
runTaskLater不会堵塞主线程,他只是在对应的未来时间创建一个任务
疾风暗影 发表于 2020-4-24 08:35
你既然调用了p.sendMessage就不要runTaskLaterAsynchronously,只能runTaskLater
可以在里面调用一个同步线程
疾风暗影 发表于 2020-4-24 08:35
你既然调用了p.sendMessage就不要runTaskLaterAsynchronously,只能runTaskLater
https://www.mcbbs.net/thread-535223-1-1.html
我看这个里面介绍会堵塞主线程
是不是在120秒后才会运行一下指定代码,运行指定代码的时候会一下堵塞主线程(但会很快)
然后循环执行的那个不用异步的话会一直堵塞主线程是吗
3079655185 发表于 2020-4-24 08:50
https://www.mcbbs.net/thread-535223-1-1.html
我看这个里面介绍会堵塞主线程
是不是在120秒后才会运行 ...
是不是在120秒后才会运行一下指定代码,运行指定代码的时候会一下堵塞主线程(但会很快)
差不多是这样
如果你的task很耗时(比如循环里很多事),那么就会严重阻塞,tps拉低。。
疾风暗影 发表于 2020-4-24 08:53
差不多是这样
如果你的task很耗时(比如循环里很多事),那么就会严重阻塞,tps拉低。。 ...
问个进阶点的问题,怎么循环执行调用BukkitAPI的方法
emm 懂...
你说的循环执行指什么呢?
想每tick调用一次的话直接注册scheduler就行了
想每tick调用一次的话直接注册scheduler就行了
高版本:BukkitRunnable#runTaskLater()
低版本:Bukkit.getScheduler().runTaskLater(BukkitRunnable)
https://bukkit.windit.net/javadoc/
低版本:Bukkit.getScheduler().runTaskLater(BukkitRunnable)
https://bukkit.windit.net/javadoc/
3079655185 发表于 2020-4-24 09:02
问个进阶点的问题,怎么循环执行调用BukkitAPI的方法
runTaskTimer
疾风暗影 发表于 2020-4-24 09:05
你说的循环执行指什么呢?
想每tick调用一次的话直接注册scheduler就行了
Bukkit.getScheduler().runTaskLater()
参数怎么填
3079655185 发表于 2020-4-24 09:15
Bukkit.getScheduler().runTaskLater()
参数怎么填
- Bukkit.getScheduler().runTaskAsynchronously(this, () -> {
- Bukkit.getScheduler().runTask(this, () -> player.sendMessage("超时!"));
- });
把this换成插件对象
本帖最后由 3079655185 于 2020-4-24 09:41 编辑
就是异步中套同步呗,那我用这个BukkitRunnable里面的可以吗https://www.mcbbs.net/thread-535223-1-1.html
mangiare 发表于 2020-4-24 09:26
把this换成插件对象
就是异步中套同步呗,那我用这个BukkitRunnable里面的可以吗https://www.mcbbs.net/thread-535223-1-1.html