設計一個執行緒超時終止的執行緒池
起因是公司有一個定時任務,對於幾千的VPN,做一個埠對映,去取得對方客戶的硬體資訊,做一個監控。
但是部分VPN會連線不通,等待的時間又過長,所以設計這麼一個執行緒池。
原貼提供了一個執行緒超時終止的實現方式,我再在這個基礎上,整理成一個執行緒池。
首先是執行緒超時終止
import java.util.concurrent.Callable; public class CallableImpl implements Callable<String> { private static final String CORRECT_KEY = "OK"; private String key = ""; public CallableImpl(String key) { this.key = key; } public String call() { // TODO:真正的業務邏輯 if (CORRECT_KEY.equals(this.getKey())) { return "SUCCESS"; } else { try { Thread.sleep(5000); // 阻塞。設定5秒超時,為了Future丟擲TimeoutException } catch (InterruptedException e) { e.printStackTrace(); } return "FAIL"; } } public String getKey() { return key; } public void setKey(String key) { this.key = key; } }
這樣就是一個執行緒超時終止的例子了。繼續整理成執行緒池來操作import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; public class ControlTimeOut { public static <T> T call(Callable<T> callable) { ExecutorService executor = Executors.newCachedThreadPool(); Future<T> future = executor.submit(callable); try { T t = future.get(3000, TimeUnit.MILLISECONDS); executor.shutdown(); return t; } catch (InterruptedException e) { System.out.println("InterruptedException"); } catch (ExecutionException e) { System.out.println("ExecutionException"); } catch (TimeoutException e) { // TODO: coding here... System.out.println("TimeoutException"); } return null; } }
public class FutureTask implements Runnable { private String text; @Override public void run() { // TODO Auto-generated method stub String result = ControlTimeOut.call(new CallableImpl(text)); System.out.println(text+"============="+Thread.currentThread().getName()+"================"+result); } public FutureTask(String text) { super(); this.text = text; } }
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
public class FutureTest {
public static void main(String[] args) throws InterruptedException {
FutureTask task1 = new FutureTask("OK");
FutureTask task2 = new FutureTask("not OK");
FutureTask task3 = new FutureTask("not OK");
FutureTask task4 = new FutureTask("not OK");
FutureTask task5 = new FutureTask("not OK");
FutureTask task6 = new FutureTask("not OK");
FutureTask task7 = new FutureTask("not OK");
FutureTask task8 = new FutureTask("not OK");
FutureTask task9 = new FutureTask("OK");
ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 50, 100, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(100),
new ThreadFactoryBuilder().setNameFormat("FutureTest-pool-%d").build());
executor.submit(task1);
executor.submit(task2);
executor.submit(task3);
executor.submit(task4);
executor.submit(task5);
executor.submit(task6);
executor.submit(task7);
executor.submit(task8);
executor.submit(task9);
while (executor.getActiveCount() > 0) {
System.out.println("活躍執行緒為:" + executor.getActiveCount());
Thread.sleep(3000);
}
System.out.println("活躍執行緒為:" + executor.getActiveCount());
executor.shutdown();
}
}
在Main方法裡面,建立多個FutureTask來模擬多個VPN聯通任務,然後執行緒池來實現業務
執行以後可以看出,超時的執行緒被終止了
相關推薦
設計一個執行緒超時終止的執行緒池
起因是公司有一個定時任務,對於幾千的VPN,做一個埠對映,去取得對方客戶的硬體資訊,做一個監控。 但是部分VPN會連線不通,等待的時間又過長,所以設計這麼一個執行緒池。 原貼提供了一個執行緒超時終止的實現方式,我再在這個基礎上,整理成一個執行緒池。 首先是執行緒超時終
論壇貼吧問題:如何終止執行時間超時的執行緒
因為現在我要監控遠端的一個方法,當這個方法執行超過一段時間時,我就要拋棄這個任務.那個方法我不能修改 測試程式碼: public class MyThreadPool{ private static MyThreadPool myThreadPool = null; /**
關於檔案讀寫,執行緒超時終止問題
在對網路檔案下載進行讀寫操作時,有時候會因為網路問題導致 “Connection reset” 異常以及有時會在一半的時候卡住,針對這個兩種情況需要重新去下載,第一種異常比較好判斷,可以直接拿錯誤資訊即可判斷,第二種情況想到的辦法就是利用執行緒去解決,給下載單獨開啟一個子執
設計一個快取系統 java多執行緒讀寫鎖的應用
package test; import java.util.HashMap; import java.util.Map; import java.util.Random; import java.util.concurrent.locks.ReadWriteLock;
java 多執行緒管理執行緒任務,根據優先順序執行 任務超時管理 執行緒同步執行管理
需求 需要根據優先順序執行任務,有任務不是特別重要,可以稍後執行;需要對正在執行的執行緒做超時監控;有的API依賴任務返回結果,執行緒池執行的時候任務也支援同步任務; 簡單測試 建立一個使用支援優先順序佇列(new PriorityBlockingQu
Java設計一個可追蹤是否成功執行的方法
沒寫過web應用的人永遠不知道只能看log日誌debug的痛苦 因此,設計一個可追蹤是否成功執行的方法,並在專案中廣泛使用,對web應用來說很重要 使用: public class Test{ public static void main(S
C++設計一個執行緒安全的懶漢單例模式
#incldue<iostream> #include<mutex> using namespace std; class CSingleton { public: static CSingleton* GetCSingleton() { if (_p ==
一個CPU核可以設計為兩個以上的執行緒
多核的下一步是多執行緒 柳鯤鵬 2011-9-19 關鍵字:處理器 多核 多執行緒 簡介:多核之後,處理器的下一個發展方向是多執行緒。 自某年以後,電腦的處理器開始向多核發展。到了今天,基本都是多核了,起碼也是個雙核。吾以為隨後會向多處
asp.net core C#設計一個實用的執行緒池
菜菜呀,我最近研究技術呢,發現線上一個任務程式執行緒數有點多呀 CEO,CTO,CFO於一身的CXO
設計一個模組,功能是列出系統中所有核心執行緒的程式名、PID號和程序狀態。
一、Linux的核心模組 核心模組是Linux核心向外部提供的一個插口,其全稱為動態可載入核心模組(Loadable Kernel Module,LKM),簡稱模組。Linux核心之所以提供模組機制,是因為它本身是一個單核心(monolithic kernel)。單核心的最大優點是效率高,因為所有的內容都整
Java多執行緒設計模式(6)兩階段終止模式
一 Thread-Specific Storage Pattern Thread-Specific Storage Pattern指的就是執行緒獨有的儲藏庫,針對每個執行緒提供記憶體空間的意義。這種模式只有一個入口,但是內部會對每個執行緒提供特有的儲存空間。 Thread-Spe
一個神奇的bug:OOM?優雅終止執行緒?系統記憶體佔用較高?
摘要:該專案是DAYU平臺的資料開發(DLF),資料開發中一個重要的功能就是ETL(資料清洗)。ETL由源端到目的端,中間的業務邏輯一般由使用者自己編寫的SQL模板實現,velocity是其中涉及的一種模板語言。 Velocity之OOM Velocity的基本使用 Velocity模板語言的基本使用程式碼如
終止執行緒的方法(不看後悔,看了必懂)
在java語言中,可以使用stop()方法和suspend()方法來終止執行緒的執行. 當使用Thread.stop()來終止執行緒時,它會釋放已經鎖定的所有監視資源,具有不安全性 suspend()方法不會釋放鎖,容易發生死鎖(兩個或者兩個以上程序在執行過程中,因爭奪資源而造成程序間互
併發之終止執行緒
圍繞“如何突然終止執行緒”展開 終止被阻塞的任務 執行緒四種狀態:新建 就緒 阻塞 死亡 任務被阻塞的四大原因:sleep wait 互斥鎖 IO 阻塞的任務不能立即到達檢查點(如isCanel),要終止它,請跳出阻塞(中斷它)。 interrupt() shutDownNow() 中斷單一
作業系統,核心定時器:使用“訊號”建立一種使用者空間機制來測量一個多執行緒程式的執行時間。
核心是一個作業系統的核心。它負責管理系統的程序、記憶體、裝置驅動程式、檔案和網路系統,決定著系統的效能和穩定性。 定時器是Linux提供的一種定時服務的機制,它在某個特定的時間喚醒某個程序來進行工作。核心在時鐘中斷髮生後檢測各定時器是否到期,在li
C# 多執行緒學習系列四之取消、超時子執行緒操作
1、簡介 雖然ThreadPool、Thread能開啟子執行緒將一些任務交給子執行緒去承擔,但是很多時候,因為某種原因,比如子執行緒發生異常、或者子執行緒的業務邏輯不符合我們的預期,那麼這個時候我們必須關閉它,而不是讓它繼續執行,消耗資源.讓CPU不在把時間和資源花在沒有意義的程式碼上.
Java——多執行緒基本使用(四) 執行緒組和執行緒池的使用,工廠設計模式的使用
1.執行緒組的概述和使用 Java中使用ThreadGroup來表示執行緒組,它可以對一批執行緒進行分類管理,Java允許程式直接對執行緒組進行控制。 &n
如何終止執行緒的執行(C/C++)
想要終止執行緒的執行,可以使用以下方法: 1、執行緒函式返回(最好使用該方法)。 2、通過呼叫ExitThread函式,執行緒將自行撤消(最好不使用該方法)。 3、同一個程序或另一個程序中的執行緒呼叫TerminateThread函式(應避免使用該方法)。&nbs
2018-11-28親測有效的python執行緒終結,終止執行緒方法
import ctypes def _async_raise(tid, exctype): """raises the exception, performs cleanup if needed""" if not inspect.isclass(exctype):
【原創】一個執行緒oom,程序裡其他執行緒還能執行嗎?
引言 這題是一個網友@大臉貓愛吃魚給我的提問,出自今年校招美團三面的一個真題。大致如下 一個程序有3個執行緒,如果一個執行緒丟擲oom,其他兩個執行緒還能執行麼? 先說一下答案,答案是還能執行 不瞞大家說,真在面試中,我遇到這一題,我估計也是答錯。因為我初看到這一題,內心嘿嘿一笑,覺得這題是在考察JVM的