導航:首頁 > 編程語言 > java如何終止線程

java如何終止線程

發布時間:2023-03-16 13:21:52

㈠ eclipse中怎樣停止正在運行的java多線程,用什麼快捷鍵,謝謝

我想這個是沒有快捷鍵的,你可以在控制台裡面使用terminate終止程序,或者在任務管理器裡面終止java應用程序的運行

㈡ java程序中如何中斷正在運行的線程

通過條件變數控制線程的執行,線程內部檢查變數狀態,外部基纖改變變數值可控制停止執行。蠢喚為保證線程間的即時通信,需帶鋒凱要使用使用volatile關鍵字或鎖,確保讀線程與寫線程間變數狀態一致。下面給一個最佳模板:
/**
* @author bruce_sha (bruce-sha.github.io)
* @version
*/
public class BestPractice extends Thread {
private volatile boolean finished = false; // ① volatile條件變數
public void stopMe() {
finished = true; // ② 發出停止信號
}
@Override
public void run() {
while (!finished) { // ③ 檢測條件變數
// do dirty work // ④業務代碼
}
}
}

㈢ 如何在JAVA中讓一個線程死亡或結束

當線程執行完畢或被其它線程殺死,線程就進入死亡狀態,這時線程不可能再進入就緒狀態等待執行。
線程進入死亡狀態的方法有兩種:
1、自然終止:正常運行run()方法後終止;
2、異常終止:調用stop()方法讓一個線程終止運行。
如下代碼:
public class ThreadDemo implements Runnable{
public void run() {
}
}
當run方法執行結束,即線程死亡(結束)。

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

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

㈤ 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版本中 它將不復存在

一些輕率的傢伙可能被另一種方法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描述了這一方式

ListingBclassExample extendsThread{volatilebooleanstop=false;publicstaticvoidmain(Stringargs[])throwsException{Example thread=newExample ();System out println( Startingthread );thread start();Thread sleep( );System out println( Askingthreadtostop );thread stop=true;Thread sleep( );System out println( Stoppingapplication );//System exit( );}publicvoidrun(){while(!stop){System out println( Threadisrunning );longtime=System currentTimeMillis();while((System currentTimeMillis() time< )&&(!stop)){}}System out println( Threadexitingunderrequest );}}

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

Startingthread Threadisrunning Threadisrunning Threadisrunning Askingthreadtostop Threadexitingunderrequest Stoppingapplication

雖然該方法要求一些編碼 但並不難實現 同時 它給予線程機會進行必要的清理工作 這在任何一個多線程應用程序中都是絕對需要的 請確認將共享變數定義成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這個示例描述了該技術

ListingCclassExample extendsThread{volatilebooleanstop=false;publicstaticvoidmain(Stringargs[])throwsException{Example thread=newExample ();System out println( Startingthread );thread start();Thread sleep( );System out println( Askingthreadtostop );thread stop=true;//如果線程阻塞 將不會檢查此變數thread interrupt();Thread sleep( );System out println( Stoppingapplication );//System exit( );}publicvoidrun(){while(!stop){System out println( Threadrunning );try{Thread sleep( );}catch(InterruptedExceptione){System out println( Threadinterrupted );}}System out println( Threadexitingunderrequest );}}

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

Startingthread Threadrunning Threadrunning Threadrunning Askingthreadtostop Threadinterrupted Threadexitingunderrequest Stoppingapplication

中斷I/O操作

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

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

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

ListingDimportjava io *;classExample extendsThread{publicstaticvoidmain(Stringargs[])throwsException{Example thread=newExample ();System out println( Startingthread );thread start();Thread sleep( );System out println( Interruptingthread );thread interrupt();Thread sleep( );System out println( Stoppingapplication );//System exit( );}publicvoidrun(){ServerSocketsocket;try{socket=newServerSocket( );}catch(IOExceptione){System out println( Couldnotcreatethesocket );return;}while(true){System out println( Waitingforconnection );try{Socketsock=socket accept();}catch(IOExceptione){System out println( accept()failedorinterrupted );}}}}

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

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

ListingEimport *;importjava io *;classExample extendsThread{volatilebooleanstop=false;volatileServerSocketsocket;publicstaticvoidmain(Stringargs[])throwsException{Example thread=newExample ();System out println( Startingthread );thread start();Thread sleep( );System out println( Askingthreadtostop );thread stop=true;thread socket close();Thread sleep( );System out println( Stoppingapplication );//System exit( );}publicvoidrun(){try{socket=newServerSocket( );}catch(IOExceptione){System out println( Couldnotcreatethesocket );return;}while(!stop){System out println( Waitingforconnection );try{Socketsock=socket accept();}catch(IOExceptione){System out println( accept()failedorinterrupted );}}System out println( Threadexitingunderrequest );}}

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

Startingthread Waitingforconnection Askingthreadtostop accept()failedorinterrupted Threadexitingunderrequest Stoppingapplication

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

㈦ Java中如何中斷線程

1: 給你的尺宏或線程類一個標識符,然後在循環中對這個標志做判斷,如果為false則跳出循環,自動結束線程(線程在run()裡面執行陵伍完就自動關閉了),而你可以再線程外對絕盯這個標識符做控制。2: 對線程對象調用interrupt(),這樣在run中使用sleep,wait等方法時自動拋出一個InterruptedException異常,在catch裡面可以跳出循環。

㈧ java 兩個線程 怎麼停止其中一個

有2種方法可以使終止線程。

1. 使用退出標志,使線程正鬍渣常退出,也就是當run方法慶歷完成褲差悄後線程終止
2. 使用interrupt方法中斷線程

㈨ java線程如何停止

終止線程的三種方法:
1. 使用退出標志,使線程正常退出,也就是當run方法完成後線程終止。
2. 使用stop方法強行終止線程(這個方法不推薦使用,因為stop和suspend、resume一樣,也可能發生不可預料的結果)。
3. 使用interrupt方法中斷線程。

1. 使用退出標志終止線程
當run方法執行完後,線程就會退出。但有時run方法是永遠不會結束的。如在服務端程序中使用線程進行監聽客戶端請求,或是其他的需要循環處理的任務。在這種情況下,一般是將這些任務放在一個循環中,如while循環。如果想讓循環永遠運行下去,可以使用while(true){……}來處理。但要想使while循環在某一特定條件下退出,最直接的方法就是設一個boolean類型的標志,並通過設置這個標志為true或false來控制while循環是否退出。下面給出了一個利用退出標志終止線程的例子。

packagechapter2;

{
publicvolatilebooleanexit=false;
publicvoidrun()
{
while(!exit);
}
publicstaticvoidmain(String[]args)throwsException
{
ThreadFlagthread=newThreadFlag();
thread.start();
sleep(5000);//主線程延遲5秒
thread.exit=true;//終止線程thread
thread.join();
System.out.println("線程退出!");
}
}

在上面代碼中定義了一個退出標志exit,當exit為true時,while循環退出,exit的默認值為false.在定義exit時,使用了一個Java關鍵字volatile,這個關鍵字的目的是使exit同步,也就是說在同一時刻只能由一個線程來修改exit的值,

2. 使用stop方法終止線程
使用stop方法可以強行終止正在運行或掛起的線程。我們可以使用如下的代碼來終止線程:
thread.stop();
雖然使用上面的代碼可以終止線程,但使用stop方法是很危險的,就象突然關閉計算機電源,而不是按正常程序關機一樣,可能會產生不可預料的結果,因此,並不推薦使用stop方法來終止線程。

3. 使用interrupt方法終止線程
使用interrupt方法來終端線程可分為兩種情況:
(1)線程處於阻塞狀態,如使用了sleep方法。
(2)使用while(!isInterrupted()){……}來判斷線程是否被中斷。
在第一種情況下使用interrupt方法,sleep方法將拋出一個InterruptedException例外,而在第二種情況下線程將直接退出。下面的代碼演示了在第一種情況下使用interrupt方法。

packagechapter2;

{
publicvoidrun()
{
try
{
sleep(50000);//延遲50秒
}
catch(InterruptedExceptione)
{
System.out.println(e.getMessage());
}
}
publicstaticvoidmain(String[]args)throwsException
{
Threadthread=newThreadInterrupt();
thread.start();
System.out.println("在50秒之內按任意鍵中斷線程!");
System.in.read();
thread.interrupt();
thread.join();
System.out.println("線程已經退出!");
}
}

上面代碼的運行結果如下:
在50秒之內按任意鍵中斷線程!
sleep interrupted
線程已經退出!
在調用interrupt方法後, sleep方法拋出異常,然後輸出錯誤信息:sleep interrupted.
注意:在Thread類中有兩個方法可以判斷線程是否通過interrupt方法被終止。一個是靜態的方法interrupted(),一個是非靜態的方法isInterrupted(),這兩個方法的區別是interrupted用來判斷當前線是否被中斷,而isInterrupted可以用來判斷其他線程是否被中斷。因此,while (!isInterrupted())也可以換成while (!Thread.interrupted())。

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

中斷(Interrupt)一個線程意味著在該線程完成任務之前停止其正在進行的一切,有效地中止其當前的操作。
線程是死亡、還是等待新的任務或是繼續運褲磨行至下茄態一步,就取決於這個程序。雖然初次看來它可能顯得簡單,但是,你必須進行一些預警以實現期望的結果。你最好還是牢記以下的告誡。
首先,忘掉Thread.stop方法。雖然它確實停止了一個正在運行的線程,然而,這種方法是不安全也是不受提倡的,這意味著,在未來的JAVA版本中,它將不復存在。
中斷線程最好的,最受推薦的方式是,使用共享變數(shared variable)發出信號,告訴線程必須停止正在運行的任務。線程必須周期性的核查這一變數(尤胡納斗其在冗餘操作期間),然後有秩序地中止任務。

閱讀全文

與java如何終止線程相關的資料

熱點內容
變頻器加密密碼 瀏覽:792
美國銀行加密市場 瀏覽:382
我的世界伺服器如何tp玩家 瀏覽:24
app下載統計怎麼找 瀏覽:262
荔枝app怎麼看適合自己的發型 瀏覽:369
魔獸世界client文件夾 瀏覽:539
解壓音樂輕松入睡 瀏覽:270
c盤文件夾卡頓怎麼辦 瀏覽:448
增量調制編解碼實驗數據 瀏覽:761
電流采樣信號進單片機 瀏覽:189
編程教育課程收費 瀏覽:415
伺服器的氣怎麼寫 瀏覽:395
怎麼刪除授時伺服器地址 瀏覽:143
android基礎組件 瀏覽:666
建興app怎麼變成黑色了 瀏覽:51
文件壓縮包如何加密文件 瀏覽:183
2010提出的演算法 瀏覽:674
冰櫃壓縮機的壽命 瀏覽:105
辦公室采訪程序員 瀏覽:569
美橙雲伺服器購買 瀏覽:754