我对java相当陌生,并且开始使用不同的线程,以便在我的代码的一部分上使用wait()
或sleep()
,并让其他部分继续运行。
对于这个项目,我将JFrame
与javax.swing.*
和java.awt.*
导入一起使用。我试图做的是让其中一个线程(在我的代码中,它是主要的,起始线程)允许玩家在tic tac脚趾板上选择一个空格,当他们点击它时,它将改变图标,然后人工智能将等待1秒钟,然后从我创建的第二个线程回放。
不幸的是,每当我调用ait.sleep(1000)
(ait
是我的线程名)时,两个线程都会等待1秒钟才能完成执行。谁能告诉我为什么一个线程的睡眠会停止我的整个执行?
谁能告诉我为什么一个线程的睡眠会停止我的整个执行
为了更好地解释您的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中添加的,但是TimerTask
和Thread
在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)可以有单