Java Thread.sleep(延迟)不起作用

标签 java multithreading sleep

您好,我尝试每 X 秒执行一次任务,但遇到问题:

Thread joinThread = new Thread(() -> {
    for (int i = 0; i < amount; i++) {
        Player player = new Player(user, RandomUtils.randomString(10), host, p, event.getSession());
        player.join();
    }

    try {
        Thread.sleep(delay);
    } catch (InterruptedException ignored) {
        ignored.printStackTrace();
    }
});

joinThread.start();

看起来Thread.sleep(delay)被忽略了,因为我的线程每毫秒执行一次而不是延迟

这是我的加入方法:

public void join(){
    GameProfile profile = session.getFlag("profile");
    Client c = new Client(host, port, new MinecraftProtocol(name), new TcpSessionFactory(proxy));
    c.getSession().addListener(new SessionAdapter() {
        @Override
        public void packetReceived(PacketReceivedEvent event) {
            if (event.getPacket() instanceof ServerJoinGamePacket) {
                user.setBotAmount(u.getBotAmount()+1);
                user.addBot(event.getSession());
                System.out.println("Player bot joined");
            }
        }

        @Override
        public void disconnected(final DisconnectedEvent event) {
            if(event.getCause() != null) event.getCause().printStackTrace();
            user.setBotAmount(u.getBotAmount() -1);
        }
    });
    c.getSession().connect();
}

如果删除player.join();,它就会像魅力一样工作。
有什么建议吗?我不明白我做错了什么。

最佳答案

首先,线程的主体(run 方法的主体)执行一次。

您正在尝试为每个玩家延迟。然后,您需要将 Thread.sleep(delay) 放在循环中的 player.join() 之后:

for (int i = 0; i < amount; i++) {
    Player player = ...;
    player.join();

    try {
        Thread.sleep(delay);
    } catch (InterruptedException reallyIgnored) {}
}

否则,您将在所有玩家都已处理完毕之后进行延迟,这是没有意义的。

确保delay变量设置正确。 Thread.sleep 花费的时间以毫秒为单位。要感受差异,该值应该为 >1000

关于Java Thread.sleep(延迟)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48510398/

相关文章:

java - 使用 camel rest-dsl 相互调用

java - 如何从 Java 中查找和终止正在运行的进程?

iphone - 使用调度队列进行 Google 地理编码的效率 - 如何改进 - iPhone

oracle - PL/SQL 函数 dbms_lock.sleep 安全吗?

multithreading - Tomcat中的线程休眠

python-3.x - QStatusBar.showMessage() 没有持续更新

Java - 创建没有时区的日历

java - Spring data mongodb并发获取和更新是线程安全的吗?

java - 为什么没有 volatile 的 DCL 对原语有效?

multithreading - 当您终止()一个线程(TThread 类)时,它是否会退出该线程的每个子线程?