2010-02-21 3 views
4

J'ai deux threads, et je veux m'assurer que je fais la synchronisation correctement sur LinkedBlockingQueue. Est-ce correct? Ou la synchronisation explicite sur (messageToCommsQueue) n'est-elle pas nécessaire?Est-ce que cela nécessite une synchronisation explicite?

Déclaration:

private LinkedBlockingQueue<BaseMessage> messagesToCommsQueue; 

méthode:

private void startOperationModeStatusMessageExecutor() { 

    ScheduledExecutorService operationModeStatusExecutor = Executors.newSingleThreadScheduledExecutor(); 
    operationModeStatusExecutor.scheduleAtFixedRate((new Runnable() { 

     @Override 
     public void run() { 
      MT02OperationModeStatusMessage commsOperateMsg; 
       commsOperateMsg = MessageFactory.getMT1102OperationModeStatusMessage(status.ordinal()); 
      synchronized (messagesToCommsQueue) { 
       messagesToCommsQueue.add(commsOperateMsg); 
      } 
     } 

    }), 0, 10, TimeUnit.SECONDS); 
} 

Méthode Deux:

Executor commsSenderExecutor = Executors.newSingleThreadExecutor(); 
    commsSenderExecutor.execute(new Runnable() { 

     @Override 
     public void run() { 
      while (getStatus().equals(OperationModeStatus.INITIATE) || getStatus().equals(OperationModeStatus.OPERATE)) { 
       BaseMessage m = null; 
       try { 
        synchronized (messagesToCommsQueue) { 
         m = messagesToCommsQueue.take(); 
        } 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 



      } 
     } 

    }); 

Répondre

3

Oui, ce n'est pas nécessaire. JavaDoc indique que:

Les implémentations BlockingQueue sont thread-safe.

Questions connexes