0

我已经在实时消息上实现了一个线程池执行器。

这是一些相关的示例代码:

class MessageProcessor implements SomeListener{
     StateInfo stateInfo;
     ExecutorService pool;
     MessageProcessor(StateInfo stateInfo) {
       pool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1);
       this.stateInfo = stateInfo;
     }
     @Override
     void processMessage(final String messageComesInRealTime) {
         Runnable runner = new Runnable() {
           public void run() {
             if(!stateInfo.in_state) {
                 if(stateInfo.state == 1) {
                   stateInfo.in_state = true;
                   //do something with message
                   stateInfo.state = 2;
                 }
                 else if(stateInfo.state == 2) {
                  stateInfo.in_state = true;
                   //do something with message
                   stateInfo.state = 3;
                 }
                 //etc...
              }
         } 
       };
       pool.execute(runner);
       //etc...
    }
}

在 processMessage 方法中,消息以高速率实时进入,同时处理多条消息。但是当 stateInfo.state 变为真时,我不希望以同样的方式评估其他消息进程。在这种情况下完全删除线程会更好吗?或者在保持线程执行的同时有办法解决这个问题吗?感谢您的任何回复。

4

1 回答 1

0

根据您的评论,听起来您需要同步对 in_state 变量的访问和分配。

您可以像这样简单地执行此操作:

private final Object lock = new Object();
//...
public void run(){
    boolean inState = false;
    synchronized(lock){
        inState = inState();
        if(inState){ setInState(false);}
    }
}
boolean inState(){
        return this.stateInfo.in_state;
}
void setInState(boolean value){
    this.stateInfo.in_state=value;
}

还要确保将 StateInfo 中的 in_state 变量声明为 volatile。

于 2013-07-05T18:19:29.530 回答