[英]Multithreading problems
我正在嘗試更多地了解 Java 中的多線程,但我的努力已停止在此代碼上:
package io.nlaz.test.commands;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.entity.Player;
import java.util.List;
public class test implements TabExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
try {
Thread a24 = new Thread(() -> {
try {
Thread.sleep(1000);
sender.sendMessage("2");
Thread.sleep(2000);
sender.sendMessage("4");
} catch (Exception e) {
e.printStackTrace();
}
});
Thread a35 = new Thread(() -> {
try {
Thread.sleep(3000);
sender.sendMessage("3");
Thread.sleep(2000);
sender.sendMessage("5");
} catch (Exception e) {
e.printStackTrace();
}
});
sender.sendMessage("1");
a24.start();
a35.start();
} catch (Exception e) { e.printStackTrace(); }
return false;
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
return null;
}
}
當代碼運行時,它應該每秒發送一條最多計數 5 條的消息。 但是在運行時它會達到 2,然后等待 a24 線程完成,然后執行 a35。 我已經查找了可能的解決方案,但是它們都導致主線程暫停,或者與我已經遇到的完全相同的問題。
我確實有一部分可能是因為我使用的是Thread.sleep()
而不是Thread.currentThread().wait()
之類的東西。 但是,當我使用該方法時,我收到一條錯誤java.lang.IllegalMonitorStateException: current thread is not owner
。 任何建議都有幫助,謝謝!
不要將Thread
與 Bukkit 的插件一起使用。 Spigot 有自己的線程系統。
BukkitTask task = Bukkit.getScheduler().runTaskTimer(myPlugin, new Runnable() {
private int timer = 4;
@Override
public void run() {
if(timer == 4 || timer ==2) {
sender.sendMessage("Time: " + timer);
}
if(timer == 0) {
task.cancel();
}
timer--;
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.