1. 程式人生 > >Java執行緒的傳說(3)——如何關閉一個正在accept的ServerSocket?

Java執行緒的傳說(3)——如何關閉一個正在accept的ServerSocket?

加入一個ServerSocket正在另一個執行緒堵塞accept,那如何停止accept或者關閉Socket?Server socket 設定下超時 setSoTimeout 然後在Listen執行緒中用interrupt其實直接close socket也可以,不過會丟擲異常,我的意思是有什麼比較安全而又簡單的辦法?難道要加一個標誌,然後要關閉的時候把標誌設為stop,然後連線listernSocket?這樣也未免太麻煩了JDK5.0裡面新增了java.util.concurrent包(對於多執行緒的開發建議儘量使用這個包),下面是javadoc裡面的樣例程式碼用法示例下面給出了一個網路服務的簡單結構,這裡執行緒池中的執行緒作為傳入的請求。它使用了預先配置的Executors.newFixedThreadPool(int) 工廠方法:
 
java 程式碼
 
class NetworkService implements Runnable { 
   private final ServerSocket serverSocket; 
   private final ExecutorService pool; 
 
   public NetworkService(int port, int poolSize) 
       throws IOException { 
     serverSocket = new ServerSocket(port); 
     pool = Executors.newFixedThreadPool(poolSize); 
   } 
 
   public void run() { // run the service 
     try { 
       for (;;) { 
         pool.execute(new Handler(serverSocket.accept())); 
       } 
     } catch (IOException ex) { 
       pool.shutdown(); 
     } 
   } 
 } 
 
 class Handler implements Runnable { 
   private final Socket socket; 
   Handler(Socket socket) { this.socket = socket; } 
   public void run() { 
     // read and service request on socket 
   } 
}

 
下列方法分兩個階段關閉 ExecutorService。第一階段呼叫 shutdown 拒絕傳入任務,然後呼叫 shutdownNow(如有必要)取消所有遺留的任務:

java 程式碼
 
void shutdownAndAwaitTermination(ExecutorService pool) { 
  pool.shutdown(); // Disable new tasks from being submitted 
  try { 
    // Wait a while for existing tasks to terminate 
    if (!pool.awaitTermination(60, TimeUnit.SECONDS)) { 
      pool.shutdownNow(); // Cancel currently executing tasks 
      // Wait a while for tasks to respond to being cancelled 
      if (!pool.awaitTermination(60, TimeUnit.SECONDS)) 
          System.err.println("Pool did not terminate"); 
    } 
  } catch (InterruptedException ie) { 
    // (Re-)Cancel if current thread also interrupted 
    pool.shutdownNow(); 
    // Preserve interrupt status 
    Thread.currentThread().interrupt(); 
  } 

記憶體一致性效果:執行緒中向 ExecutorService 提交 Runnable 或 Callable 任務之前的操作 happen-before 由該任務所提取的所有操作,後者依次 happen-before 通過 Future.get() 獲取的結果。

軟體包 java.util.concurrent

相關推薦

java執行3種建立方式

Java使用Thread類代表執行緒,所有的執行緒物件都必須是Thread類或其子類的例項。Java可以用三種方式來建立執行緒,如下所示: 1)繼承Thread類建立執行緒 2)實現Runnable介面建立執行緒 3)實現Callable介面建立執行緒 4)通過執行緒池的方式建立(這

java執行池和關閉執行池中的執行

如果執行緒經常喜歡去new的話是不對的,你需要一個池子管理。 newCachedThreadPool 這個一個帶快取的執行緒池,是個可以無限大的執行緒池,新建的執行緒放倒這個池子裡,當執行緒停掉了的時候,下個個執行緒進來,可以複用這個執行緒。 newFixe

java執行取消與關閉

行為良好的軟體能很完善地處理失敗、關閉和取消等過程。 1、任務取消的原因:1、使用者請求取消;2、有時間的限制;3、應用程式事件;4、錯誤;5、關閉 (1)中斷:呼叫interrupt只是傳遞了請求中斷,並不意味著立即停止目標執行緒; (2)中斷策略:規定執行緒如何解釋某個

Java執行狀態和關閉執行的正確姿勢

1、執行緒狀態及切換   Java中的執行緒有六種狀態,使用執行緒Thread內的列舉類來實現,如下,我對每個狀態都進行了一定的解釋。   public enum State { /** 表示一個執行緒還沒啟用(即未呼叫start方法)*/ NEW,

Java執行的傳說(3)——如何關閉一個正在accept的ServerSocket?

加入一個ServerSocket正在另一個執行緒堵塞accept,那如何停止accept或者關閉Socket?Server socket 設定下超時 setSoTimeout 然後在Listen執行緒中用interrupt其實直接close socket也可以,不過會丟擲異

Java併發程式設計例項--3.打斷一個執行

一般來講一個java程式如果執行著多個執行緒,那麼只有在這些執行緒都執行完畢後才會終止。但有時候,我們需要去結束某個執行緒或者取消某個任務。此時就用到了Java執行緒的打斷機制,即interruptio

實現java執行3種方式,99%人沒用過第3

實現多執行緒的3種方式 1、繼承Thread類 看jdk原始碼可以發現,Thread類其實是實現了Runnable介面的一個例項,繼承Thread類後需要重寫run方法並通過start方法啟動執行緒。 繼承Thread類耦合性太強了,因為java只能單繼承,所以不利

Java執行片——執行關閉

引 前文再續,書接上一回。前文講述瞭如何開啟執行緒以及開啟執行緒的三種方法。本文主要圍繞如何優雅的關閉Java執行緒。 在我們尋求Java執行緒的關閉關閉方式的時候,我們也許會按住Ctrl鍵進入到Thread類中閱讀原始碼,很快的我們就能找到一個stop()方法。似乎stop()方法就是

java執行3 執行狀態

執行緒從建立到結束執行,經過多個狀態,每個狀態對應著不同的操作,具體如下: 1 建立(new),2 可以執行(runnable)、3 執行(running)、4 等待(waiting)、5 阻塞(blocked)、6 結束(dead) 建立執行緒 當通過new Thre

Java執行(智播客視訊)

(一)傳統執行緒技術回顧 1.建立執行緒的兩種方式 (1)建立Thread的子類,重寫run方法 (2)給Thread類傳入Runnable介面 (3)兩種建立方式的比較 第一點:通過建立執行緒方式可以看出,一個是繼承一個是實現介面,由

一個線上小問題解決過程 —— java執行池使用注意點

表象和場景 最近小夥伴在凌晨0點40分左右會收到某臺伺服器報警,cpu使用率過高(達到95%),但是不到10分鐘使用率降到45%,在之後5分鐘內降到10%以內,服務恢復。 背景:公司是用微服務架構,某個產品大約有30多個微服務,前端用阿里雲的SLB,架了nginx叢集;

java執行系列3:悲觀鎖和樂觀鎖

1.悲觀鎖和樂觀鎖的基本概念 悲觀鎖: 總是認為當前想要獲取的資源存在競爭(很悲觀的想法),因此獲取資源後會立刻加鎖,於是其他執行緒想要獲取該資源的時候就會一直阻塞直到能夠獲取到鎖; 在傳統的關係型資料庫中,例如行鎖、表鎖、讀鎖、寫鎖等,都用到了悲觀鎖。還有java中的同步關鍵字Synchroniz

Java執行詳解(3)-執行棧模型與執行的變數

要理解執行緒排程的原理,以及執行緒執行過程,必須理解執行緒棧模型。         執行緒棧是指某時刻時記憶體中執行緒排程的棧資訊,當前呼叫的方法總是位於棧頂。執行緒棧的內容是隨著程式的執行動態變化的,因此研究執行緒棧必須選擇一個執行的時刻(實際上指程式碼執行到什麼地方)。

JAVA執行】如何解決一個生產者與消費者問題

                             如何解決一個生產者與消費者問題 生產者與消費者問題是多執行緒同步的一個經典問題。生產者和消費者同時使用一塊緩衝區,生產者生產商品放入緩衝區,消費者從緩衝區中取出商品。我們需要保證的是,當緩衝區滿時,生產者不可生產商品

《JVM故障診斷指南》之3 —— Java 執行: JVM持有記憶體的分析

原文連結 原文作者:Byron Kiourtzoglou 翻譯:梅小西(904516706) 前面我們已經討論過JVM裡不同的堆空間,這節我們會給你提供教程,是關於如何從你的活動的應用Java執行緒中確定它持有多少堆空間,以及在哪裡佔用。這裡有個來自Oracle Weblogic 10.0生產

java執行3Java對多執行的支援1

宣告:本教程不收取任何費用,歡迎轉載,尊重作者勞動成果,不得用於商業用途,侵權必究!!! 文章目錄 1、Java在語言級提供了對多執行緒程式設計的支援。 2、實現多執行緒程式的兩種方式 3、後臺執行緒 4、yield方法 5、執行緒優先順序 1、Java在語言級提

java 執行池 使用例項 03 建立執行的第3式 02 如何建立執行 執行併發與synchornized

在前面的文章中,我們使用執行緒的時候就去建立一個執行緒,這樣實現起來非常簡便,但是就會有一個問題: 如果併發的執行緒數量很多,並且每個執行緒都是執行一個時間很短的任務就結束了,這樣頻繁建立執行緒就會大大降低系統的效率,因為頻繁建立執行緒和銷燬執行緒需要時間。 那麼有沒有一種辦法使得執行緒可以複用,就是執行

Java執行值有三種方式,以及另類的第四種方式

現在博主的需求是:有可能在同一個執行緒類執行不一樣的程式。上邊兩個紅框中的cron4j排程器使用的是一個,根據引數不同來執行的。如果我點選後邊的手動執行一次,按照我上邊給出的java程式碼是無法實現的。看下邊的新的程式碼: (adsbygoogle = window.adsbygoo

Java執行關閉2-shutdown和awaitTermination

awaitTermination()是一個阻塞方法。它必須等執行緒池退出後才會結束自身。可以設定阻塞時間。 public class Test { public static void main(String[] args) throws IOException, I

Java實現執行3種方式

package com.main; import java.util.concurrent.ExecutionException; import java.util.concurrent.Exe