猿问

在同一个线程中创建多个定时器导致主线程滞后

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


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


我用于计时器的代码:


                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,对过程的其余部分没有影响。为什么会发生这种情况,我应该怎么做?


慕尼黑的夜晚无繁华
浏览 156回答 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();

明月笑刀无情

就对方法的最少修改而言,类似这样的方法可能会起作用: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循环内的条件即可。您的线程方法没有改变任何内容的原因是您从未启动该线程。至于为什么你的主线程挂起,这可能与你没有在此处发布的代码有关。
随时随地看视频慕课网APP

相关分类

Java
我要回答