简体   繁体   English

Java Thread.sleep(delay)无法正常工作

[英]Java Thread.sleep(delay) not working

Hi I'm trying to execute task every X seconds and I have problem with it: 嗨,我试图每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();

It looks like Thread.sleep(delay) is ignored because my thread is executing itself every ms instead of delay 看起来Thread.sleep(delay)被忽略了,因为我的线程每毫秒执行一次而不是延迟执行

Here's my join method: 这是我的join方法:

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();
}

If remove player.join(); 如果删除player.join(); , it's working like a charm. ,它的工作就像一种魅力。
Any advice? 有什么建议吗? I don't see what I'm doing wrong. 我看不到我在做什么错。

First off, the body of a thread (the body of the run method) executes once. 首先,线程的主体( run方法的主体)执行一次。

You are trying to make a delay for each player. 您正在尝试延迟每个玩家。 Then you need to put the Thread.sleep(delay) inside the loop after the player.join() : 然后,您需要将Thread.sleep(delay)放在player.join()之后的循环中:

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

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

Otherwise, you are going to make a delay after all the players are already processed which makes no sense. 否则, 所有播放器都已处理之后 ,您将延迟这是没有意义的。

Make sure that the delay variable is set correctly. 确保正确设置了delay变量。 The Thread.sleep takes time in milliseconds. Thread.sleep花费的时间以毫秒为单位。 To feel the difference, the value is supposed to be >1000 . 为了感觉不同,该值应>1000

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM