2016-04-25 28 views
0

我有一個Netty服務器,我需要在另一個線程中關閉請求Channel。這樣做是否安全?如果沒有,是否可以採取一些解決方法來解決它?任何建議表示讚賞!是Netty Channel.close()線程安全嗎?

順便說一句,我使用netty-4.0.34與NioEventLoopGroup。

AbstractChannelHandlerContext.java:514

@Override 
    public ChannelFuture close(final ChannelPromise promise) { 
    if (!validatePromise(promise, false)) { 
     // cancelled 
     return promise; 
    } 

    final AbstractChannelHandlerContext next = findContextOutbound(); 
    EventExecutor executor = next.executor(); 
    if (next.isHandlerAddedCalled() && executor.inEventLoop()) { 
     next.invokeClose(promise); 
    } else { 
     safeExecute(executor, new OneTimeTask() { 
      @Override 
      public void run() { 
       next.invokeClose(promise); 
      } 
     }, promise, null); 
    } 

    return promise; 
} 

如果被另一個線程的IO線程該通道一直堅持將最終沒有關閉,因爲「executor.inEventLoop()」將始終爲false。這個解釋是真的嗎?

回答

0

它是線程安全的,但如果請求正在運行,您可能會在管道和客戶端觸發異常。

+0

感謝Nicholas, – Walter

+0

在我的場景中,我使用'org.quartz-scheduler'啓動了一個計時器線程,並在時間do時關閉通道。由於計時器線程不是EventLoop中的IO線程,所以我想知道哪個線程最終會關閉進程? – Walter

+1

您可能會考慮使用閒置處理程序來完成此操作。 – Nicholas

相關問題