有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在同一个线程中创建多个计时器会导致主线程延迟

我试图运行一些代码,在100毫秒后启用一个变量,再等待100毫秒,然后禁用它

我试着使用两个计时器,创建一个新的线程并休眠它。这两种解决方案都会导致主线程挂起一秒钟左右

我用于计时器的代码:

                new java.util.Timer().schedule(
                        new java.util.TimerTask() {
                            @Override
                            public void run() {
                                PlayerControl.MoveForward = false;
                            }
                        },
                        100
                );
                new java.util.Timer().schedule(
                        new java.util.TimerTask() {
                            @Override
                            public void run() {
                                PlayerControl.MoveForward = true;
                            }
                        },
                        200
                );

对于线程方法:

new Thread(() -> {
    Thread.sleep(100);
    PlayerControl.MoveForward = false;
    Thread.sleep(100);
    PlayerControl.MoveForward = true;
})

我希望这两个结果都等待100毫秒,将变量设置为false,等待100毫秒,然后再次将其设置为true,而不会影响流程的其余部分。为什么会这样,我应该怎么做


共 (2) 个答案

  1. # 1 楼答案

    就对你的方法进行最少修改而言,这样的方法可能会奏效:

    new Thread(() -> {
        Thread.sleep(100);
        PlayerControl.MoveForward = false;
        Thread.sleep(100);
        PlayerControl.MoveForward = true;
    }).start();
    

    如果你想让它永远运行,只需做如下操作:

    new Thread(() -> {
        for(;;) {
            Thread.sleep(100);
            PlayerControl.MoveForward = false;
            Thread.sleep(100);
            PlayerControl.MoveForward = true;
        }
    }).start();
    

    如果想限制迭代次数,只需更改for循环中的条件即可

    你的线程方法没有改变任何事情的原因是你从来没有启动过线程。至于你的主线程为什么挂起,这可能与你没有在这里发布的代码有关

  2. # 2 楼答案

    在所有非守护进程线程完成之前,主线程不会退出

    您可以通过以下操作使计时器线程成为执事:

                new java.util.Timer(true).schedule(
                        new java.util.TimerTask() {
                            @Override
                            public void run() {
                                PlayerControl.MoveForward = false;
                            }
                        },
                        100
                );
    

    对于普通线程,您可以执行以下操作:

    Thread thread = new Thread(() -> {
        ...
    });
    thread.setDaemon(true);
    thread.start();