java停止線程,java停止線程池

本文目錄一覽:

java中終止線程的方法?

在Java的多線程編程中,java.lang.Thread類型包含了一些列的方法start(),stop(),stop(Throwable)andsuspend(),destroy()andresume()。通過這些方法,我們可以對線程進行方便的操作,但是這些方法中,只有start()方法得到了保留。本文是海文國際小編搜索整理的關於JAVA中終止線程的方法,供參考複習,希望對大家有所幫助!

如果真的需要終止一個線程,可以使用以下幾種方法:

1、讓線程的run()方法執行完,線程自然結束。(這種方法最好)

2、通過輪詢和共享標誌位的方法來結束線程,例如while(flag){},flag的初始值設為真,當需要結束時,java課程培訓機構建議將flag的值設為false。(這種方法也不很好,因為如果while(flag){}方法阻塞了,則flag會失效)

Java如何中斷一個正在運行的線程

程序是很簡易的 然而 在編程人員面前 多線程呈現出了一組新的難題 如果沒有被恰當的解決 將導致意外的行為以及細微的 難以發現的錯誤

在本篇文章中 我們針對這些難題之一 如何中斷一個正在運行的線程

背景中斷(Interrupt)一個線程意味著在該線程完成任務之前停止其正在進行的一切 有效地中止其當前的操作 線程是死亡 還是等待新的任務或是繼續運行至下一步 就取決於這個程序 雖然初次看來它可能顯得簡單 但是 你必須進行一些預警以實現期望的結果 你最好還是牢記以下的幾點告誡

首先 忘掉Thread stop方法 雖然它確實停止了一個正在運行的線程 然而 這種方法是不安全也是不受提倡的 這意味著 在未來的JAVA版本中 它將不復存在

一些輕率的傢伙可能被另一種方法Thread interrupt所迷惑 儘管 其名稱似乎在暗示著什麼 然而 這種方法並不會中斷一個正在運行的線程(待會將進一步說明) 正如Listing A中描述的那樣 它創建了一個線程 並且試圖使用Thread interrupt方法停止該線程 Thread sleep()方法的調用 為線程的初始化和中止提供了充裕的時間 線程本身並不參與任何有用的操作

class Example extends Thread {            boolean stop=false;            public static void main( String args[] ) throws Exception {            Example thread = new Example ();            System out println( Starting thread );            thread start();            Thread sleep( );            System out println( Interrupting thread );            thread interrupt();            Thread sleep( );            System out println( Stopping application );            //System exit( );            }            public void run() {            while(!stop){            System out println( Thread is running );            long time = System currentTimeMillis();            while((System currentTimeMillis() time )) {            }            }            System out println( Thread exiting under request );            }            }

如果你運行了Listing A中的代碼 你將在控制台看到以下輸出

Starting thread Thread is running Thread is running Thread is running Interrupting thread Thread is running Thread is running Thread is running Stopping application Thread is running Thread is running Thread is running

甚至 在Thread interrupt()被調用後 線程仍然繼續運行

真正地中斷一個線程

中斷線程最好的 最受推薦的方式是 使用共享變數(shared variable)發出信號 告訴線程必須停止正在運行的任務 線程必須周期性的核查這一變數(尤其在冗餘操作期間) 然後有秩序地中止任務 Listing B描述了這一方式

Listing Bclass Example  extends Thread {  volatile boolean stop = false;  public static void main( String args[] ) throws Exception {    Example  thread = new Example ();   System out println(  Starting thread  );   thread start();   Thread sleep(   );   System out println(  Asking thread to stop  );   thread stop = true;   Thread sleep(   );   System out println(  Stopping application  );   //System exit(   );  }  public void run() {    while ( !stop ) {     System out println(  Thread is running  );      long time = System currentTimeMillis();      while ( (System currentTimeMillis() time   )  (!stop) ) {      }    }   System out println(  Thread exiting under request  );  }}

運行Listing B中的代碼將產生如下輸出(注意線程是如何有秩序的退出的)

Starting thread Thread is running Thread is running Thread is running Asking thread to stop Thread exiting under request Stopping application

雖然該方法要求一些編碼 但並不難實現 同時 它給予線程機會進行必要的清理工作 這在任何一個多線程應用程序中都是絕對需要的 請確認將共享變數定義成volatile 類型或將對它的一切訪問封入同步的塊/方法(synchronized blocks/methods)中

到目前為止一切順利!但是 當線程等待某些事件發生而被阻塞 又會發生什麼?當然 如果線程被阻塞 它便不能核查共享變數 也就不能停止 這在許多情況下會發生 例如調用Object wait() ServerSocket accept()和DatagramSocket receive()時 這裡僅舉出一些

他們都可能永久的阻塞線程 即使發生超時 在超時期滿之前持續等待也是不可行和不適當的 所以 要使用某種機制使得線程更早地退出被阻塞的狀態

很不幸運 不存在這樣一種機制對所有的情況都適用 但是 根據情況不同卻可以使用特定的技術 在下面的環節 我將解答一下最普遍的例子

使用Thread interrupt()中斷線程

正如Listing A中所描述的 Thread interrupt()方法不會中斷一個正在運行的線程 這一方法實際上完成的是 在線程受到阻塞時拋出一個中斷信號 這樣線程就得以退出阻塞的狀態 更確切的說 如果線程被Object wait Thread join和 Thread sleep三種方法之一阻塞 那麼 它將接收到一個中斷異常(InterruptedException) 從而提早地終結被阻塞狀態

因此 如果線程被上述幾種方法阻塞 正確的停止線程方式是設置共享變數 並調用interrupt()(注意變數應該先設置) 如果線程沒有被阻塞 這時調用interrupt()將不起作用 否則 線程就將得到異常(該線程必須事先預備好處理此狀況) 接著逃離阻塞狀態 在任何一種情況中 最後線程都將檢查共享變數然後再停止 Listing C這個示例描述了該技術

Listing Cclass Example  extends Thread {  volatile boolean stop = false;  public static void main( String args[] ) throws Exception {   Example  thread = new Example ();   System out println(  Starting thread  );   thread start();   Thread sleep(   );   System out println(  Asking thread to stop  );   thread stop = true;//如果線程阻塞 將不會檢查此變數   thread interrupt();   Thread sleep(   );   System out println(  Stopping application  );   //System exit(   );  }  public void run() {    while ( !stop ) {     System out println(  Thread running  );      try {      Thread sleep(   );      } catch ( InterruptedException e ) {      System out println(  Thread interrupted  );      }    }   System out println(  Thread exiting under request  );  }}

一旦Listing C中的Thread interrupt()被調用 線程便收到一個異常 於是逃離了阻塞狀態並確定應該停止 運行以上代碼將得到下面的輸出

Starting thread Thread running Thread running Thread running Asking thread to stop Thread interrupted Thread exiting under request Stopping application

中斷I/O操作

然而 如果線程在I/O操作進行時被阻塞 又會如何?I/O操作可以阻塞線程一段相當長的時間 特別是牽扯到網路應用時 例如 伺服器可能需要等待一個請求(request) 又或者 一個網路應用程序可能要等待遠端主機的響應

如果你正使用通道(channels)(這是在Java 中引入的新的I/O API) 那麼被阻塞的線程將收到一個 ClosedByInterruptException異常 如果情況是這樣 其代碼的邏輯和第三個例子中的是一樣的 只是異常不同而已

但是 你可能正使用Java 之前就存在的傳統的I/O 而且要求更多的工作 既然這樣 Thread interrupt()將不起作用 因為線程將不會退出被阻塞狀態 Listing D描述了這一行為 儘管interrupt()被調用 線程也不會退出被阻塞狀態

Listing Dimport java io *;class Example  extends Thread {  public static void main( String args[] ) throws Exception {    Example  thread = new Example ();   System out println(  Starting thread  );   thread start();   Thread sleep(   );   System out println(  Interrupting thread  );   thread interrupt();   Thread sleep(   );   System out println(  Stopping application  );   //System exit(   );  }  public void run() {   ServerSocket socket;    try {      socket = new ServerSocket( );    } catch ( IOException e ) {     System out println(  Could not create the socket  );      return;    }    while ( true ) {     System out println(  Waiting for connection  );      try {       Socket sock = socket accept();      } catch ( IOException e ) {      System out println(  accept() failed or interrupted  );      }    }  }}

很幸運 Java平台為這種情形提供了一項解決方案 即調用阻塞該線程的套接字的close()方法 在這種情形下 如果線程被I/O操作阻塞 該線程將接收到一個SocketException異常 這與使用interrupt()方法引起一個InterruptedException異常被拋出非常相似

唯一要說明的是 必須存在socket的引用(reference) 只有這樣close()方法才能被調用 這意味著socket對象必須被共享 Listing E描述了這一情形 運行邏輯和以前的示例是相同的

Listing Eimport  *;import java io *;class Example  extends Thread {  volatile boolean stop = false;  volatile ServerSocket socket;  public static void main( String args[] ) throws Exception {    Example  thread = new Example ();   System out println(  Starting thread  );   thread start();   Thread sleep(   );   System out println(  Asking thread to stop  );   thread stop = true;   thread socket close();   Thread sleep(   );   System out println(  Stopping application  );   //System exit(   );  }  public void run() {    try {      socket = new ServerSocket( );    } catch ( IOException e ) {     System out println(  Could not create the socket  );      return;    }    while ( !stop ) {     System out println(  Waiting for connection  );      try {       Socket sock = socket accept();      } catch ( IOException e ) {      System out println(  accept() failed or interrupted  );      }    }   System out println(  Thread exiting under request  );  }}

以下是運行Listing E中代碼後的輸出

Starting thread Waiting for connection Asking thread to stop accept() failed or interrupted Thread exiting under request Stopping application

    多線程是一個強大的工具 然而它正呈現出一系列難題 其中之一是如何中斷一個正在運行的線程 如果恰當地實現 使用上述技術中斷線程將比使用Java平台上已經提供的內嵌操作更為簡單 lishixinzhi/Article/program/Java/gj/201311/27481

java如何關閉線程

關閉線程有幾種方法,

一種是調用它裡面的stop()方法

另一種就是你自己設置一個停止線程的標記 (推薦這種)

代碼如下:

package com.demo;

//測試Thread的stop方法和自己編寫一個停止標記來停止線程;

public class StopThread implements Runnable{

//停止線程的標記值boolean;

private boolean flag = true;

public void stopThread(){

flag = false;

}

public void run(){

int i=0;

while(flag){

i++;

System.out.println(Thread.currentThread().getName()+”:”+i);

try{

Thread.sleep(1000);

}catch(Exception e){

}

System.out.println(Thread.currentThread().getName()+”==”+i);

}

}

public static void main(String args[]){

StopThread st = new StopThread();

Thread th = new Thread(st);

Thread th1 = new Thread(st);

th.start();

th1.start();

try{

Thread.sleep(5500);

}catch(Exception e){

}

/*

如果使用Thread.stop方法停止線程,不能保證這個線程是否完整的運行完成一次

run方法;但是如果使用停止的標記位,那麼可以保正在真正停止之前完整的運行完

成一次run方法;

*/

th.stop();

st.stopThread();

}

}

java多線程中如何有效的停止當前線程。

中斷(Interrupt)一個線程意味著在該線程完成任務之前停止其正在進行的一切,有效地中止其當前的操作。

線程是死亡、還是等待新的任務或是繼續運行至下一步,就取決於這個程序。雖然初次看來它可能顯得簡單,但是,你必須進行一些預警以實現期望的結果。你最好還是牢記以下的告誡。

首先,忘掉Thread.stop方法。雖然它確實停止了一個正在運行的線程,然而,這種方法是不安全也是不受提倡的,這意味著,在未來的JAVA版本中,它將不復存在。

中斷線程最好的,最受推薦的方式是,使用共享變數(shared variable)發出信號,告訴線程必須停止正在運行的任務。線程必須周期性的核查這一變數(尤其在冗餘操作期間),然後有秩序地中止任務。

java 怎麼強制關閉 一個線程 ?

在Java的多線程編程中,java.lang.Thread類型包含了一些列的方法start(), stop(), stop(Throwable) and suspend(), destroy() and resume()。通過這些方法,我們可以對線程進行方便的操作,但是這些方法中,只有start()方法得到了保留。\x0d\x0a在Sun公司的一篇文章《Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 》中詳細講解了捨棄這些方法的原因。\x0d\x0a如果真的需要終止一個線程,可以使用以下幾種方法: \x0d\x0a1、讓線程的run()方法執行完,線程自然結束。(這種方法最好)\x0d\x0a\x0d\x0a2、通過輪詢和共享標誌位的方法來結束線程,例如while(flag){},flag的初始值設為真,當需要結束時,將flag的值設為false。(這種方法也不很好,因為如果while(flag){}方法阻塞了,則flag會失效)\x0d\x0a如果線程因為執行sleep()或是wait()而進入Not Runnable狀態,假如是wait() 用標誌位就方法就不行了,\x0d\x0apublic final void wait(long timeout)\x0d\x0a throws InterruptedException此方法導致當前線程(稱之為 T)將其自身放置在對象的等待集中,然後放棄此對象上的所有同步要求。即當前線程變為等待狀態\x0d\x0await() 的標準使用方法\x0d\x0asynchronized(obj){\x0d\x0awhile(){\x0d\x0aobj.wait();\x0d\x0a}\x0d\x0a滿足條件的處理過程\x0d\x0a}\x0d\x0a而您想要停止它,您可以使用第三種即\x0d\x0a3 使用interrupt(),而程式會丟出InterruptedException例外,因而使得執行緒離開run()方法

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/206085.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-07 17:49
下一篇 2024-12-07 17:49

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論