本文目錄一覽:
java線程如何停止?
通過調用interrupt方法可以使得處於阻塞狀態的線程拋出一個異常,即interrupt方法可以用來中斷一個正處於阻塞狀態的線程;另外,改方法還會設置線程的中斷狀態(註:isInterrupted()可以用來查詢中斷狀態)。
線程阻塞在reader.readLine()時,即使主線程改變了標誌變數,但是並不能立即結束子線程,只有等待阻塞被打破,且運行到下一次循環條件判斷的時候才能終止。所以在使用這種方法時,應該考慮到阻塞這種情況。當然,如果整個循環內的操作屬於同一事務時,這種方法倒很不錯。
調用線程對象的interrupt()時,sleep的線程會拋出InterruptedException異常,從而中斷循環,終止線程。但是如果是IO如輸入這些阻塞,中斷的方法又不起作用了,還有就是對於沒有阻塞的線程,調用interrupt()是達不到終止線程的效果的。
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()方法
java多線程中如何有效的停止當前線程。
中斷(Interrupt)一個線程意味著在該線程完成任務之前停止其正在進行的一切,有效地中止其當前的操作。
線程是死亡、還是等待新的任務或是繼續運行至下一步,就取決於這個程序。雖然初次看來它可能顯得簡單,但是,你必須進行一些預警以實現期望的結果。你最好還是牢記以下的告誡。
首先,忘掉Thread.stop方法。雖然它確實停止了一個正在運行的線程,然而,這種方法是不安全也是不受提倡的,這意味著,在未來的JAVA版本中,它將不復存在。
中斷線程最好的,最受推薦的方式是,使用共享變數(shared variable)發出信號,告訴線程必須停止正在運行的任務。線程必須周期性的核查這一變數(尤其在冗餘操作期間),然後有秩序地中止任務。
java 中如何使線程運行一定時間後停止?
java中使線程運行一定時間後停止,可以設置一個變數,當滿足條件則退出線程:
import static java.lang.Thread.currentThread;
import java.util.concurrent.TimeUnit;
public class ThreadPauseDemo{
public static void main(String args[]) throws InterruptedException {
Game game = new Game();
Thread t1 = new Thread(game, “T1”);
t1.start();
// 現在停止Game線程
System.out.println(currentThread().getName() + ” is stopping game thread”);
game.stop();
// 查看Game線程停止的狀態
TimeUnit.MILLISECONDS.sleep(200);
System.out.println(currentThread().getName() + ” is finished now”);
}
}
class Game implements Runnable{
private volatile boolean isStopped = false;
public void run(){
while(!isStopped){
System.out.println(“Game thread is running……”);
System.out.println(“Game thread is now going to pause”);
try{
Thread.sleep(200);
} catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(“Game thread is now resumed……”);
}
System.out.println(“Game thread is stopped……”);
}
public void stop(){
isStopped = true;
}
}
程序輸出如下:
Game thread is running……
main is stopping game thread
Game thread is now going to pause
Game thread is now resumed……
Game thread is stopped……
main is finished now
如何停止一個Java線程
1. 使用退出標誌,使線程正常退出,也就是當run方法完成後線程終止。
2. 使用stop方法強行終止線程(這個方法不推薦使用,因為stop和suspend、resume一樣,也可能發生不可預料的結果)。
3. 使用interrupt方法中斷線程。
1. 使用退出標誌終止線程
當run方法執行完後,線程就會退出。但有時run方法是永遠不會結束的。如在服務端程序中使用線程進行監聽客戶端請求,或是其他的需要循環處理的任務。在這種情況下,一般是將這些任務放在一個循環中,如while循環。如果想讓循環永遠運行下去,可以使用while(true){……}來處理。但要想使while循環在某一特定條件下退出,最直接的方法就是設一個boolean類型的標誌,並通過設置這個標誌為true或false來控制while循環是否退出。下面給出了一個利用退出標誌終止線程的例子。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/250764.html