1. 程式人生 > >多執行緒的完美停止辦法!

多執行緒的完美停止辦法!

這個是上面部分是自己的總結,後面部分段落總結來自網上!

多執行緒的停止有三種方式:

1.呼叫stop()

2.自定義一個停止flag

3.使用中斷!

呼叫stop()

如果使用thread.stop()來強行終止的話,就像突然斷電,可能會產生不可預料的結果android新的版本已經放棄stopstop已被打上過時的標籤!

不推薦使用!

二.自定義一個stopflag

private volatile boolean stopFlag= false; 

@Override
public void run() { 
   while (!stopFlag){
<span style="white-space:pre">	</span>try{			
		Thread.sleep(1000); //阻塞5妙		
	    }catch(InterruptedException e){
		e.printStackTrace();					
		break;//捕獲到異常之後,執行break跳出迴圈。
	    }
    }
}	

在定義stopFlag時,使用了一個Java關鍵字volatile,這個關鍵字的目的是使stopFlag同步,也就是說在同一時刻只能由一個執行緒來修改stopFlag的值。

第三種用中斷!

mThreadSafe.interrupt();
mThreadSafe = null;
@Override
public void run() { 
    while (!isInterrupted()){
	try{	
		Thread.sleep(1000); //阻塞5妙	
	    }catch(InterruptedException e){
		e.printStackTrace();
<span style="white-space:pre">		</span>break;//捕獲到異常之後,執行break跳出迴圈。
	    }	
     }				
} 

使用interrupt()方法來終端執行緒可分為兩種情況:

1.執行緒處於阻塞狀態

如使用了sleep,同步鎖的wait,socket的receiver,accept等方法時,會使執行緒處於阻塞狀態。當呼叫執行緒的interrupt()方法時,系統會丟擲一個InterruptedException異常,程式碼中通過捕獲異常,然後break跳出迴圈狀態,使執行緒正常結束。通常很多人認為只要呼叫interrupt方法執行緒就會結束,實際上是錯的,一定要先捕獲InterruptedException異常之後通過break來跳出迴圈,才能正常結束run方法。

2.

執行緒未進入阻塞狀態

使用isInterrupted()判斷執行緒的中斷標誌來退出迴圈,當使用interrupt()方法時,中斷標誌就會置true,和使用自定義的標誌來控制迴圈是一樣的道理。

為什麼要區分進入阻塞狀態和和非阻塞狀態兩種情況了

解釋:是因為當阻塞狀態時,如果有interrupt()發生,系統除了會丟擲InterruptedException異常外,還會呼叫interrupted()函式,呼叫時能獲取到中斷狀態是true的狀態,呼叫完之後會復位中斷狀態為false,所以異常丟擲之後通過isInterrupted()是獲取不到中斷狀態是true的狀態,從而不能退出迴圈,因此在執行緒未進入阻塞的程式碼段時是可以通過isInterrupted()來判斷中斷是否發生來控制迴圈,在進入阻塞狀態後要通過捕獲異常來退出迴圈。因此使用interrupt()來退出執行緒的最好的方式應該是兩種情況都要考慮。







相關推薦

執行完美停止辦法

這個是上面部分是自己的總結,後面部分段落總結來自網上! 多執行緒的停止有三種方式: 1.呼叫stop() 2.自定義一個停止flag 3.使用中斷! 一 呼叫stop() 如果使用thread.stop()來強行終止的話,就像突然斷電,可能會產生不可預料的結果。an

基於Python的執行爆破小工具誰用誰就知道它有屌了

0×0 背景   進群:548377875  就可以獲取數十套小編精心準備的PDF以及零基礎到進階的教程! Patator是出於對使用Hydra,Medusa,Ncrack,Metasploit模組和Nmap NSE指令碼進行密碼猜測攻擊而感到失望後, 選擇了不

我不是黑客,但是我輕鬆用python打造執行密碼爆破工具

  python程式設計,學程式設計是真的費勁,寫了點自己想折騰的東西,雖然說坑很多,今天還是過去了。一個ZIP密碼破解的程式,還是給了我驚喜,下面會說。編輯器的話今天發現sublimetext比pycharm好用多了,在大佬的幫助下終於調對了,電腦各種坑。  

Java執行停止不了的執行

    停止執行緒可以呼叫interrupt()方法,但是interrupt()方法的使用效果並不像for + break 語句那樣,馬上就停止迴圈。呼叫interrupt()方法僅僅是在當前執行緒中打了一個停止的標記。並不是真的停止執行緒。下面舉個例子: public cl

執行】——停止執行的三種方式

前提    停止執行緒是在多執行緒開發時非常重要的方式,掌握執行緒的停止可以對執行緒的停止進行有效的處理。停止執行緒在Java中不像break那樣乾脆,而需要一些技巧性。停止執行緒的方式有三種,分別展示

spring執行事物解決辦法

1、最近做專案使用了多線,但是發現多執行緒事務無法起作用,就是多執行緒執行時每個執行緒的方法雖然加了事務的註解但是資料插入依舊不會回滾2、此時主執行緒操作資料插入事物是起作用的。springboot 解決辦法    先獲取spring的context    配置中 新增事物管

凌晨1點突發致命生產事故,人工執行來破局

有一個讀者問我:你認為一個程式設計師具備什麼樣的能力,才算得上是厲害的程式設計師? 我答:擁有解決問題的能力的程式設計師。 這個回答貌似有點抽象,不要緊看下面的文章你會慢慢有所瞭解。 一、解決問題的能力 很多年前,當我還是一個小菜鳥的時候,我的領導經常告訴我,解決問題的時候,不要侷限於技術本身,並且形象的給我

Java執行可以分組,還能這樣玩

前面的文章,棧長和大家分享過多執行緒建立的3種方式《實現 Java 多執行緒的 3 種方式》。 但如果執行緒很多的情況下,你知道如何對它們進行分組嗎? 和 Dubbo 的服務分組一樣,Java 可以對相同性質的執行緒進行分組。 來看下執行緒類 Thread 的所有構造方法。 如圖所示,帶有 Thr

執行之同步鎖 加鎖和執行停止

一.同步程式碼塊(同步鎖) 寫法: synchronized(鎖){ 上鎖的程式碼 } 當執行緒進入同步程式碼塊 會把鎖拿走 執行程式碼塊中的程式碼 程式碼執行完畢後 會把鎖還回去 如果執行緒遇到同步程式碼塊 發現沒有鎖 將進入等待(有鎖才可進) 鎖的注意:保證所有執行緒使用的是同一個鎖

QT執行中,物件訊號與槽連線不上的解決辦法

1、在接收者建立執行緒中,把接收者移動到主執行緒中: pReceiverObj->moveToThread(QApplication::instance()->thread()); 2、這樣傳送訊號的時候,就會在主執行緒事件佇列處理中來處理了。 把connect的最

乾貨執行池+CountDownLatch,實現 執行併發計算、彙總

目錄結構 抽象類:求和器 單執行緒 求和器 VS 多執行緒 求和器 1)執行緒池 多個執行緒 一起併發執行,效能很生猛 2)CountDownLatch 主執行緒 使用 latch.await() 阻塞住,直到所有 子任務 都執行完畢了

java最簡單粗暴講解執行,還不趕緊上車

這裡並沒有講什麼新東西,只是把多執行緒一些知識來個總結。大家懂得可以複習複習,還有些童鞋對多執行緒朦朧的可以拿這個做為入門~ 舉個栗子說明啥是多執行緒:玩遊戲,前面一堆怪,每個怪都是一個執行緒,你射了一槍,子彈飛出去了,這顆子彈也是一個執行緒。你開啟你的程序管理,看到你遊戲的後臺程序,這就是程序

經典案例那個什麼執行--賣票..........................就是好像有點不對~~先寫下來.有大哥哥,大姐姐幫看下嗎

package javawork; public class RunnableDemo2 { public static void main(String[] args) { Runnable02 ru = new Runnable02(); Thread ru1 = new Thread(ru); T

[java基礎]一文理解java執行必備的ychronized關鍵字,從此不再混淆

java併發程式設計中最長用到的關鍵字就是synchronized了,這裡講解一下這個關鍵字的用法和容易混淆的地方. synchronized關鍵字涉及到鎖的概念, 在java中,synchronized鎖大家又通俗的稱為:方法鎖,物件鎖 和 類鎖 三種. 先上結論! 1 無論是修飾方法還是修飾程式碼塊都

[java基礎]一文理解java執行必備的sychronized關鍵字,從此不再混淆

java併發程式設計中最長用到的關鍵字就是synchronized了,這裡講解一下這個關鍵字的用法和容易混淆的地方.synchronized關鍵字涉及到鎖的概念, 在java中,synchronized

python程序與執行

有關程序、執行緒、多程序、多執行緒 執行緒與程序 概念 執行緒:是程式執行流的最小單元,是系統獨立排程和分配CPU(獨立執行)的基本單位。 程序:是資源分配的基本單位。一個程序包括多個執行緒。 區別 1.執行緒與資源分配無關,它屬於某一個程序,並與程序內的其他執行緒一起共享程

執行(四) 如何停止執行

在Thread類中提供了可以停止執行緒的方法(包括殺死和掛起):     @Deprecated     public final void stop(){}     @Deprecated     public final void suspend(){}         stop 和 sus

【本人禿頂程式設計師】執行:為什麼在while迴圈中加入System.out.println,執行可以停止

在論壇看到這樣一個程式碼: public class StopThread { private static boolean stopRequested; public static void main(String[] args) throws InterruptedE

執行:為什麼在while迴圈中加入System.out.println,執行可以停止

在論壇看到這樣一個程式碼: public class StopThread { private static boolean stopRequested; public static void main(String[] args) throws InterruptedE

Java執行基礎之停止執行

JAVA中有3種終止正在執行的執行緒: 使用退出標誌,使執行緒正常的退出,也就是run方法執行完成後執行緒終止。 使用stop方式強行終止執行緒,但是不推薦使用這種方式,因為stop和suspend及resume一樣,都是作廢過期的方法,使用它們可能產生不可預料的後果。 使用i