这需要显式同步吗?
我有两个线程,我想确保我在LinkedBlockingQueue上正确进行同步..这是正确的吗? 或者是否必须在(messageToCommsQueue)上进行显式同步?
宣言:
private LinkedBlockingQueue messagesToCommsQueue;
方法一:
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); }
方法二:
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(); } } } });
是的,没有必要。 JavaDoc说:
BlockingQueue实现是线程安全的。