有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用于实时消息处理的java多重执行

我已经对实时发送的消息实现了线程池执行器

以下是一些相关的示例代码:

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。状态变为true时,我不希望其他消息进程以相同的方式进行计算。对于这种情况,完全删除线程是否更好?或者,在维护线程执行的同时,是否有办法避免这种行为?谢谢你的回复


共 (1) 个答案

  1. # 1 楼答案

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

    您可以这样做:

    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