SkyGod666
以tpa为例,延时120秒后会取消掉请求,并发送给玩家一条消息:请求已超时
那怎么做到延时执行代码呢,而且不要堵塞主线程
求带佬们解答

天辉胡萝卜
Bukkit.getScheduler().runTaskLater

https://hub.spigotmc.org/javadoc ... lang.Runnable-long-

SkyGod666
疾风暗影 发表于 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会堵塞主线程吗 ...

既然是异步了,为什么会堵塞主线程呢?

SkyGod666
mangiare 发表于 2020-4-24 08:09
既然是异步了,为什么会堵塞主线程呢?

我问的是runTaskLater会不会堵塞主线程...

另外问下,刚刚看到了这个代码

  1. Player p = 获取玩家;
  2. new BukkitRunnable(){
  3.     @Override
  4.     public static void run(){
  5.     处理代码省略
  6.     p.sendMessage("已超时");
  7.     }
  8. }.runTaskLaterAsynchronously(this, 2400) ;
复制代码

这样是不是也可以做到120秒后给玩家发送一条消息。
另外问个我不太懂的问题,new BukkitRunnable()里面的这个p会不会随着上面的p变化啊。
就是比如两个玩家:A玩家和B玩家
A玩家输入了指令,插件运行上面的代码;在A玩家超时之前,B玩家输入指令,插件运行了上面的代码。
那最后会不会两条sendMessage都发给了B玩家

⠀蛋⠀
3079655185 发表于 2020-4-24 08:22
我问的是runTaskLater会不会堵塞主线程...

另外问下,刚刚看到了这个代码

谁执行这条命令,p就是谁咯
感觉还是Lambda好看emmmm

天辉胡萝卜
3079655185 发表于 2020-4-24 08:22
我问的是runTaskLater会不会堵塞主线程...

另外问下,刚刚看到了这个代码

你既然调用了p.sendMessage就不要runTaskLaterAsynchronously,只能runTaskLater


runTaskLater不会堵塞主线程,他只是在对应的未来时间创建一个任务

⠀蛋⠀
疾风暗影 发表于 2020-4-24 08:35
你既然调用了p.sendMessage就不要runTaskLaterAsynchronously,只能runTaskLater

可以在里面调用一个同步线程套娃,逃

SkyGod666
疾风暗影 发表于 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拉低。。

SkyGod666
疾风暗影 发表于 2020-4-24 08:53
差不多是这样

如果你的task很耗时(比如循环里很多事),那么就会严重阻塞,tps拉低。。 ...

问个进阶点的问题,怎么循环执行调用BukkitAPI的方法

Mc_Ryoko
emm  懂...

天辉胡萝卜
你说的循环执行指什么呢?

想每tick调用一次的话直接注册scheduler就行了

Sssss...
高版本:BukkitRunnable#runTaskLater()
低版本:Bukkit.getScheduler().runTaskLater(BukkitRunnable)

https://bukkit.windit.net/javadoc/

Sssss...
3079655185 发表于 2020-4-24 09:02
问个进阶点的问题,怎么循环执行调用BukkitAPI的方法

runTaskTimer

SkyGod666
疾风暗影 发表于 2020-4-24 09:05
你说的循环执行指什么呢?

想每tick调用一次的话直接注册scheduler就行了

Bukkit.getScheduler().runTaskLater()
参数怎么填

⠀蛋⠀
3079655185 发表于 2020-4-24 09:15
Bukkit.getScheduler().runTaskLater()
参数怎么填
  1. Bukkit.getScheduler().runTaskAsynchronously(this, () -> {
  2.     Bukkit.getScheduler().runTask(this, () -> player.sendMessage("超时!"));
  3. });
复制代码


把this换成插件对象

SkyGod666
本帖最后由 3079655185 于 2020-4-24 09:41 编辑
mangiare 发表于 2020-4-24 09:26
把this换成插件对象

就是异步中套同步呗,那我用这个BukkitRunnable里面的可以吗https://www.mcbbs.net/thread-535223-1-1.html

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