我正在开发一个处理传入消息的应用程序。我不精通java多线程,我请求你们的帮助,伙计们。以下应用程序结构是否有问题。
有一个带有 stopRequested boolean 字段的主应用程序类。还有一个内部可运行类用于监听传入消息并处理它们。还有另一个线程将 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();
}
}
}
}
}
谢谢。
最佳答案
有几件事需要考虑。
- 正如 sbridges 所指出的,
stopRequested
需要具有 volatile 才能解决可见性问题(否则另一个核心上的线程可能看不到更改)。 - 如果
getNewMessagesCount()
不阻塞,那么你的while循环将旋转并消耗核心;这将为您提供最低的延迟,但会占用整个核心。 - 您列出的代码似乎是一个简单的处理队列;使用 ArrayBlockingQueue 可能会更好.
- 从构造函数启动新线程是危险的。需要担心的是,如果在
ApplicationClass
创建完成之前调用getMessageCount()
和processNewMessages()
会发生什么。由于ApplicationClass
的实例可能处于不完整状态,因此您可能会发现一个相当严重的错误。 (顺便说一句,出于同样的原因,您永远不想让您的代码作为构造函数中事件的监听器订阅。)查看 Effective Java了解有关此主题的更多背景信息。 - 你的 while 循环应该检查当前线程是否已被中断,以便它放置得很好;它应该是
while (!stopRequested && !Thread.currentThread().isInterrupted())
编写正确的并发程序很困难。我强烈推荐阅读Java Concurrency in Practice ;它会减轻你很多痛苦。
关于java - 可能的锁定/性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6921890/