为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕尼黑的夜晚无繁华 2023-06-21 15:03:11
我正在尝试运行一些代码,这些代码将在 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,对过程的其余部分没有影响。为什么会发生这种情况,我应该怎么做?
查看完整描述

2 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

直到所有非守护线程都完成,主线程才会退出。


您可以通过执行以下操作使计时器线程成为守护进程:


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


查看完整回答
反对 回复 2023-06-21
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

就对方法的最少修改而言,类似这样的方法可能会起作用:


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循环内的条件即可。


您的线程方法没有改变任何内容的原因是您从未启动该线程。至于为什么你的主线程挂起,这可能与你没有在此处发布的代码有关。


查看完整回答
反对 回复 2023-06-21
  • 2 回答
  • 0 关注
  • 155 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信