1. 程式人生 > >設計一個執行緒超時終止的執行緒池

設計一個執行緒超時終止的執行緒池

起因是公司有一個定時任務,對於幾千的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的