我正在处理一个处理传入消息的应用程序。伙计们,我并不精通java多线程,我正在请求你的帮助。以下应用程序结构是否有任何问题。
主应用程序类有stopRequested布尔字段。并且有一个内部runnable类可以侦听传入的消息并处理它们。还有另一个线程将stopRequested设置为true。
这种方法是否有效,或者我错了?
下面是我的部分代码:
class ApplicationClass {
// we set this var in another thread
// when it is necessary to stop
private stopRequested = false;
public ApplicationClass() {
// starting message processing thread
(new Thread(new MessageProcessing())).start();
}
private class MessageProcessing implements Runnable {
public void run() {
while (!stopRequested) {
if (getNewMessagesCount() > 0) {
processNewMessages();
}
}
}
}
}
谢谢。
答案 0 :(得分:1)
如果不了解更多细节,很难对性能发表评论,您可能希望进行基准测试。
代码看起来是正确的,除了你想要使stopRequested volatile。如果它不是volatile,则处理线程可能看不到它被设置为false。您可能希望使用LinkedBlockingQueue,而不是使用getNewMessageCount()等方法,并使用poll()方法。
答案 1 :(得分:1)
有几点需要考虑。
stopRequested
需要易变以解决可见性问题(另一个核心上的线程可能看不到更改)。 getNewMessagesCount()
没有阻止,那么你的while循环将旋转并消耗核心;这将为您提供最低的延迟,但会占用整个核心。 getMessageCount()
创建完成之前调用processNewMessages()
和ApplicationClass
,会发生什么。由于ApplicationClass
的实例可能处于不完整状态,您可能会发现一个相当讨厌的错误。 (出于同样的原因,你永远不希望你的代码订阅作为构造函数的事件的监听器。顺便说一句,请查看Effective Java以获取有关此主题的更多背景信息。while (!stopRequested && !Thread.currentThread().isInterrupted())
编写正确的并发程序很难。我强烈建议你阅读Java Concurrency in Practice;它会为你节省很多痛苦。