【问题标题】:multiple execution for real-time message processing实时消息处理的多次执行
【发布时间】:2013-07-05 17:56:52
【问题描述】:

我已经为实时发送的消息实现了一个线程池执行器。

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

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 变为真时,我不希望以同样的方式评估其他消息进程。在这种情况下完全删除线程会更好吗?或者在保持线程执行的同时有办法解决这个问题吗?感谢您的回复。

【问题讨论】:

  • 我对你在这里做什么感到困惑。能说的详细点吗?
  • 每当有新消息进来时,都会执行 processMessage 方法。当消息率很高时,有时会同时执行 2 个或更多相同的执行,即使 stateInfo.in_state 为 true。这是唯一的问题。
  • 听起来你需要同步访问StateInfo

标签: java multithreading


【解决方案1】:

根据您的 cmets,听起来您需要同步对 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。

【讨论】:

  • 感谢您的回复,我马上尝试一下并回复您
  • 感谢您的接受!我想知道他为什么将其删除...他的解决方案在这里确实更好。
  • @lcplusplus 回想起来,我不确定解决方案的顺序执行需求,或者是否应该只在处理消息后增加状态。例如,在我的解决方案中,消息 3 可能会触发状态 2,而消息 2 可能会以状态 3 结束。这就是我删除解决方案的原因。发布的问题代码中的布尔状态检查看起来基本上强制执行单线程消息处理,除非有一些未显示的额外并发处理。
  • 我发现在这种情况下异步行为并不是真正有用。感谢您的回复。
  • 我同意@lcplusplus,这是一个奇怪的解决方案。似乎设计需要更多的工作。
猜你喜欢
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2016-05-04
相关资源
最近更新 更多