当前位置: 首页 > 知识库问答 >
问题:

对单线程使用sleep()

龚同
2023-03-14

我对java相当陌生,并且开始使用不同的线程,以便在我的代码的一部分上使用wait()sleep(),并让其他部分继续运行。

对于这个项目,我将JFramejavax.swing.*java.awt.*导入一起使用。我试图做的是让其中一个线程(在我的代码中,它是主要的,起始线程)允许玩家在tic tac脚趾板上选择一个空格,当他们点击它时,它将改变图标,然后人工智能将等待1秒钟,然后从我创建的第二个线程回放。

不幸的是,每当我调用ait.sleep(1000)(ait是我的线程名)时,两个线程都会等待1秒钟才能完成执行。谁能告诉我为什么一个线程的睡眠会停止我的整个执行?

共有1个答案

段坚
2023-03-14

谁能告诉我为什么一个线程的睡眠会停止我的整个执行

为了更好地解释您的Swing GUI是在它自己的特殊线程上创建的,与main()和其他代码将要运行的线程分开,这可以通过在SwingUtilities.invokexxx块中创建您的Swing组件来完成(即使您没有这样做,您的GUI也将在一个称为初始线程的线程上运行)。现在,如果您只是在事件调度线程上调用sleep(或者在同一个线程),那么它将等待对thread.sleep的调用完成。现在,由于所有Swing事件都在EDT上处理,我们通过调用sleep(..)来暂停它的执行,从而暂停UI事件的处理,因此GUI被冻结(直到sleep(..)返回)。

您不应该在事件调度线程上使用thread.sleep(..)(或任何线程,其中sleep会导致不必要的执行阻塞),因为这会导致UI看起来冻结。

下面是一个很好的示例,它准确地演示了在GUI的EDT上调用thread.sleep(..)所引起的不需要的行为。

而是使用:

>

  • 摆动计时器,例如:

    int delay=1000;// wait for second
    
    Timer timer = new Timer(delay, new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            //action that you want performed 
        }
    });
    //timer.setRepeats(false);//the timer should only go off once
    timer.start();
    

    更新

    Swing Timer/SwingWorker只是在Java 1.6中添加的,但是TimerTaskThread在Java 1.3和JDK 1中已经存在了更长的时间,因此您甚至可以使用上述两种方法中的任一种,以及在SwingUtilities/eventQueue#invokexx块中创建/操作Swing组件的包装调用;这就是过去做事情的方式:P

  •  类似资料:
    • 问题内容: 我编写了一个单一的Kafka使用者(使用Spring Kafka),该使用者从单个主题中读取内容,并且是使用者组的一部分。消耗完一条消息后,它将执行所有下游操作,并移至下一个消息偏移。我将其打包为WAR文件,并且我的部署管道将其推送到单个实例。使用部署管道,我可以将该工件部署到部署池中的多个实例。 但是,当我希望多个消费者作为基础架构的一部分时,我无法理解以下内容: 实际上,我可以在部

    • 我正在设计一个模块,可以支持不同的数据源。我的模块获取用户的公司id作为输入,并且我必须根据公司id调用适当的类。我正在尝试合并一些好的设计,尽可能避免条件语句。 我有一个使用此方法的FetchDataSource单例类。 “communicator”是一个接口,而communicator映射将返回适当的实例。这是同一个单例类中的populateCommunicatorMap()方法。

    • 问题内容: 我想检查多线程是否比单线程快,然后在这里进行演示: 首先我用两个sum方法运行singleThreadStart,结果是 然后我运行secondThreadStart,结果是 然后我用五和方法运行singleThreadStart,结果是 最后我运行FiveThreadStart,结果是 我的问题是: SecondThreadStart比singleThreadStart花费更多的时间

    • 我想检查多线程是否比单线程快,然后我在这里做一个演示: 首先,我用二和方法运行singleThreadStart,结果是 然后我运行第二个ThreadStart,结果是 然后我用五和方法运行singleThreadStart,结果是 最后我运行fiveThreadStart,结果是 我的问题是: SecondThreadStart比singleThreadStart花费更多的时间,是因为创建线程的

    • 为什么单线程和多线程脚本具有相同的处理时间?多线程实现不是应该少1/#线程数吗?(我知道当您达到最大cpu线程时,回报会递减) 我搞砸了我的实现吗?

    • 上下文:我正在设计一个应用程序,它将使用来自各种Amazon SQS队列的消息。(超过25个队列)为此,我正在考虑创建一个库来使用队列中的消息(称为MessageConsumer) 我希望根据队列中的流量动态分配线程来接收/处理来自不同队列的消息,以最大限度地减少资源浪费。我有两种方法可以做这件事。 1)只能有一种类型线程轮询队列、接收消息并处理这些消息,且所有队列都有一个公共线程池。2)可以有单