主動停止執行緒的處理辦法

2021-09-06 13:10:07 字數 1988 閱讀 7538

先描述一下為什麼會有停止執行緒的需求,有這樣的乙個業務場景:1、客戶端可以在任務開啟後隨時關閉執行的任務,這裡得用個執行緒持續監聽客戶端任務。2、程式可以重複接受任務並執行,結合場景1,如果關閉執行的任務就會丟擲異常,更通俗的講,任何異常都會導致程式掛掉,這樣就無法重複接受任務執行了,於是不能用主線程跑任務,還得開乙個執行緒來單獨跑任務。3、執行緒開啟後執行任務的過程中會遇到各種阻塞,客戶端需要有響應執行緒才會繼續執行。

介紹完以上的業務場景為什麼需要主動停止執行緒的需求就應運而生了,因為執行緒會阻塞,所以會不斷開啟新的執行緒來執行任務,即使執行緒池數量再多也會有執行緒不夠的情況,而且記憶體使用量會越來越多,最終導致記憶體溢位。

那麼如何才能主動停止執行緒呢?

public class orderstatehandler 

public static void doexecuting(string orderid, string account, string password)

}

上面這段**就是之前業務場景的實現,乙個執行緒用來做監聽,乙個執行緒用來跑任務。現在的問題是,如何在監聽執行緒監聽到客戶端停止任務的動作後把執行的執行緒給主動停掉?

上面的**做中兩個動作的**有些不一樣,dolistening中的執行緒池是在方法外定義好的,而doexecuting是在方法裡new了乙個新的執行緒池,這是為後面做準備的,我們再來看下面這段**就明白了:

@override

public void run() catch (interruptedexception e)

if (responsemessage3.get("msg").tostring().equals("訂單結束") || responsemessage3.get("msg").tostring().equals("訂單id為空"))

}log.info("任務結束,關閉webdriver");

driver.close();

driver.quit();

setuphandler.flag = true;

// todo: 2018/12/30 訂單被手動結束後,先立即把執行緒池關閉,後面再呼叫的時候重新建立乙個,這是目前唯一能解決立即銷毀執行緒的權宜之計了

orderstatehandler.threadpoolsecond.shutdownnow();

}

這是具體執行監聽事件動作的方法體,持續傳送請求,用responsemessage來接收,一旦發現請求中有結束的動作則把任務結束掉,最關鍵的一步是最後一段**,這裡我直接把執行任務執行緒給停掉了,而且是即刻停止(shutdown()還會等待執行的執行緒執行完,而shutdownnow()會立刻停掉所有執行緒,不管有沒有在執行),而且我之前定義的時候執行執行緒池為靜態變數,只有乙份,所以可以通過類名來直接引用來執行關閉執行緒池的動作,下次呼叫執行任務動作會重新new乙個執行緒池,總的來說就是用關閉執行緒池的方法來間接停止執行緒。

tips:如果在死迴圈中有try-catch語句的,碰巧停止執行緒的地方就在死迴圈的try語句塊中,那麼這個執行緒不會停止,會一直執行,我也不清楚是問什麼,下面有兩種解決辦法,第一:在catch中加入break來跳出死迴圈,第二,不要用try-catch改為向上拋語句throws exception。

tips2:碰巧又看到執行緒池中正好有乙個拒絕策略可以丟棄掉最老的任務來執行新任務,

也就是上面第三個策略discardoldestpolicy

static threadpoolexecutor threadpoolsecond= new threadpoolexecutor(1, 1, 60, timeunit.seconds, queue2, executingthreadfactory, new threadpoolexecutor.discardoldestpolicy());// 拋棄策略:丟棄佇列裡最老的乙個任務,並執行當前任務。
於是我建立執行緒池的時候加上了這個策略,結果跟預想的一樣,這玩意只能對阻塞佇列起作用,但是沒在佇列中直接在跑的任務執行緒依然為所欲為,所以這個方法也不行。

執行緒的停止

執行緒停止 執行緒的停止 1.停止乙個執行緒 我們一般都會通過乙個變數去控制的。2.如果需要停止乙個處於等待狀態下的執行緒,那麼我們需要通過變數配合notify方法或者interrupt 來使用。public class threaddemo5 extends thread public synch...

多執行緒 執行緒的停止

thread類中stop方法停止執行緒存在安全隱患,怎麼讓乙個執行緒停止執行呢?執行緒的執行一般都是迴圈控制體,通過改變run方法 迴圈控制條件,即可讓執行緒停止。class threadstopdemo system.out.println thread.currentthread getname...

停止執行緒的方式

當開啟乙個執行緒後我們怎麼去停止它呢?停止執行緒的方法 1 stop方法 已過時 2.run方法結束,當run方法中的任務 執行完後,執行緒自動結束 怎麼控制線程的任務結束呢?任務中都會有迴圈結構 讓執行緒重複執行 只要控制住迴圈就可以結束任務,結束執行緒。控制迴圈通常就用定義標記來完成。下例 cl...