可能的锁定/性能问题

时间:2011-08-03 05:06:51

标签: java multithreading

我正在处理一个处理传入消息的应用程序。伙计们,我并不精通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();

                }

            }

        }
    }       
} 

谢谢。

2 个答案:

答案 0 :(得分:1)

如果不了解更多细节,很难对性能发表评论,您可能希望进行基准测试。

代码看起来是正确的,除了你想要使stopRequested volatile。如果它不是volatile,则处理线程可能看不到它被设置为false。您可能希望使用LinkedBlockingQueue,而不是使用getNewMessageCount()等方法,并使用poll()方法。

答案 1 :(得分:1)

有几点需要考虑。

  1. 由于sbridges指出stopRequested需要易变以解决可见性问题(另一个核心上的线程可能看不到更改)。
  2. 如果getNewMessagesCount()没有阻止,那么你的while循环将旋转并消耗核心;这将为您提供最低的延迟,但会占用整个核心。
  3. 您列出的代码似乎是一个简单的处理队列;使用ArrayBlockingQueue时,你可能会更好。
  4. 从构造函数启动新线程是危险的。需要担心的是,如果在getMessageCount()创建完成之前调用processNewMessages()ApplicationClass,会发生什么。由于ApplicationClass的实例可能处于不完整状态,您可能会发现一个相当讨厌的错误。 (出于同样的原因,你永远不希望你的代码订阅作为构造函数的事件的监听器。顺便说一句,请查看Effective Java以获取有关此主题的更多背景信息。
  5. 你的while循环应检查当前线程是否已被中断,以便它放置好;它应该是while (!stopRequested && !Thread.currentThread().isInterrupted())
  6. 编写正确的并发程序很难。我强烈建议你阅读Java Concurrency in Practice;它会为你节省很多痛苦。