1. 程式人生 > >java多執行緒設定超時時間

java多執行緒設定超時時間

情景:多執行緒中個別執行緒執行時間會很長,如果執行緒執行時間超過某段時間,自動結束該執行緒

百度了很多答案之後大部分的解決辦法都是利用Future類中的get(long timeout,TimeUnit unit) 方法進行設定,但是這個方法是阻塞的,在取不到結果之前是不會執行後邊的程式的。

下面程式碼是按照這個方法進行的測試:

public static void main(String[] args) {
		ExecutorService pool = Executors.newFixedThreadPool(40);//建立一個可容納40個執行緒的執行緒池
		for(int i=0;i<40;i++){
			System.out.println(i+"開始時間:"+System.currentTimeMillis());
			Future future = pool.submit(new Runnable(){
				@Override
				public void run() {
					try {
						Thread.currentThread().sleep(300);
					} catch (InterruptedException e) {
					}
					System.out.println("結束時間:"+System.currentTimeMillis());
				}
				
			});
			try {
				future.get(200, TimeUnit.MILLISECONDS);
			} catch (InterruptedException e) {
				future.cancel(true);
			} catch (ExecutionException e) {
				future.cancel(true);
			} catch (TimeoutException e) {
				future.cancel(true);
			}
		}
	}
預期結果:0到40都開始執行了之後,然後對執行緒進行超時判斷

執行結果:0開始時間:1487675573448
結束時間:1487675573651
1開始時間:1487675573651
2開始時間:1487675573851
結束時間:1487675573851
3開始時間:1487675574052
結束時間:1487675574052
4開始時間:1487675574253
結束時間:1487675574253
。。。

會發現只有0結束後1才會開始,跟預期的結果不一致,完全沒有起到多執行緒該有的作用!

解決方案:

究其根源其實是在get方法,get方法會一直等待執行緒完成後才會繼續,解決思路就是:

讓40個執行緒開始執行,然後再開40個執行緒分別進行get。

public static void main(String[] args) {
		ExecutorService pool = Executors.newFixedThreadPool(40);//建立一個可容納40個執行緒的執行緒池
		final List<Future> threadList = new ArrayList<Future>();
		for(int i=0;i<40;i++){
			System.out.println(i+"開始時間:"+System.currentTimeMillis());
			Future future = pool.submit(new Runnable(){
				@Override
				public void run() {
					try {
						Thread.currentThread().sleep(300);
					} catch (InterruptedException e) {
					}
					System.out.println("結束時間:"+System.currentTimeMillis());
				}
				
			});
			threadList.add(future);
		}
		
		
		for(Future future:threadList){
			final Future futureTemp = future;
			Thread t = new Thread(new Runnable() {
				@Override
				public void run() {
					try {
						futureTemp.get(200, TimeUnit.MILLISECONDS);
					} catch (InterruptedException e) {
						futureTemp.cancel(true);
					} catch (ExecutionException e) {
						futureTemp.cancel(true);
					} catch (TimeoutException e) {
						futureTemp.cancel(true);
					}
				}
			});
			
			t.start();
		}
	}


結果:

0開始時間:1487676230783
1開始時間:1487676230784
2開始時間:1487676230785
3開始時間:1487676230785
4開始時間:1487676230785
5開始時間:1487676230785
6開始時間:1487676230785
。。。
結束時間:1487676230993
結束時間:1487676230993
結束時間:1487676230993
結束時間:1487676230994
結束時間:1487676230994
結束時間:1487676230994
結束時間:1487676230994
。。。

完美解決。

總結:還是覺得jdk應該提供一個方法有個超時時間的引數,超過時間後執行緒自動結束。

相關推薦

java執行設定超時時間

情景:多執行緒中個別執行緒執行時間會很長,如果執行緒執行時間超過某段時間,自動結束該執行緒 百度了很多答案之後大部分的解決辦法都是利用Future類中的get(long timeout,TimeUnit unit) 方法進行設定,但是這個方法是阻塞的,在取不到結果之前是不會

Java 執行設定執行超時時間之 Callable介面和Future介面 超時控制

Callable介面和Future介面介紹         在Java中,如果需要設定程式碼執行的最長時間,即超時,可以用Java執行緒池ExecutorService類配合Future介面來實現。 Future介面是Java標準API的一部分,在java.uti

Java 執行設定執行超時時間之 Callable介面和Future介面

Callable介面和Future介面介紹         在Java中,如果需要設定程式碼執行的最長時間,即超時,可以用Java執行緒池ExecutorService類配合Future介面來實現。 Future介面是Java標準API的一部分,在java.util.co

java執行設定 執行超時 非阻塞實現

執行緒是屬於非同步計算模型,所以你不可能直接從別的執行緒中得到函式返回值。 這時候,Future就出場了。Futrue可以監視目標執行緒呼叫call的情況,當你呼叫Future的get()方法以獲得結果時,當前執行緒就開始阻塞,直接call方法結束返回結果。

執行池中執行設定超時退出監控

前言 在寫多執行緒程式時,大多數情況下會先excutor建立執行緒池,然後再建立執行緒,但是對一些讀資料庫或者其他IO操作,容易堵住執行緒,此時就需要給執行緒設定超時時間,幹掉超時的執行緒再重新拉起一個執行緒來,但是java執行緒建立並沒有預留超時引數,研究了一下網上也沒找到

Java執行任務超時結束的5種實現方法

public class AwaitTermination {static class Task implements Runnable{public String name;private int time;public Task(String s,int t) {name=s;time=t;}public

java:執行(獲取名字和設定名字)

* 1.獲取名字     * 通過getName()方法獲取執行緒物件的名字 * 2.設定名字     * 通過建構函式可以傳入String型別的名字  package com.heima.threadmethod; p

Java學習筆記07--時間及日期相關 ;system類;RunTime;MATH類 ;隨機數類;java執行

===============java相關講解============= ∆ 時間及日期相關(Date Calendar SimpleDateFormat) 程式碼示例 public class Demo3 { public

java執行實現任務超時監聽

在實際的開發過程當中,會遇到這樣的需求:某些功能為了防止系統掛死,需要進行時間控制,超過一定的執行時間,就提示任務執行超時,不再繼續執行該任務,從而保證系統健壯性和穩定性。其實仔細想想,我們可以把這樣的需求,全部歸結為一種“超時控制的業務模型”,建立起自己熟悉的業務模型,以

Java執行中static變數的使用 SimpleDateFormat時間格式化存線上程安全問題

兩篇文章 Java多執行緒中static變數的使用  (轉自:http://blog.csdn.net/yy304935305/article/details/52456771) &&  SimpleDateFormat時間格式化存線上程安全問題

java 執行管理執行任務,根據優先順序執行 任務超時管理 執行同步執行管理

需求 需要根據優先順序執行任務,有任務不是特別重要,可以稍後執行;需要對正在執行的執行緒做超時監控;有的API依賴任務返回結果,執行緒池執行的時候任務也支援同步任務; 簡單測試 建立一個使用支援優先順序佇列(new PriorityBlockingQu

Java執行超時範圍內等待完成的幾種方法

        在工程專案中可能會有這麼一個場景,客戶端處理層需要從服務端(CDN/圖片伺服器)獲取n張圖片(參考微博一個人最多有9張圖片),那麼問題來了,如何在一定的時間範圍內儘可能多的獲取到圖片。當然,最為簡單粗暴的方法就是通過序列的方式來獲取,但是如果第一個請求hang

Java執行實現電影院售票案例

某電影院目前正在上映賀歲大片,共有100張票,而它有3個售票視窗,請設計一個程式模擬該電影院售票。 定義Sell類實現Runnable介面,很好的解決了單繼承共享資源問題 public class Sell implements Runnable { // 定義100張票,三個售票

java執行物件鎖、類鎖、同步機制詳解

1.在java多執行緒程式設計中物件鎖、類鎖、同步機制synchronized詳解:     物件鎖:在java中每個物件都有一個唯一的鎖,物件鎖用於物件例項方法或者一個物件例項上面的。     類鎖:是用於一個類靜態方法或者class物件的,一個

Java 執行實現死鎖場景

簡述: 《Java 程式設計思想》  P718 ~ P722 模擬死鎖的場景, 三個人 三根筷子,每個人需要拿到身邊的兩根筷子才能開始吃飯 出現死鎖的場景是,三個人都拿到了右邊的筷子,但是由於筷子都被搶佔,均無法獲得左邊的筷子 Chopstick.java

Java 執行 join和interrupt 方法

簡述: 使用Java多執行緒中join和interrupt函式 《Java程式設計思想》 P669 ~ P670 一個執行緒可以再其他執行緒上呼叫join()方法,其效果是等待一段時間直到第二個執行緒結束才繼續執行。 如果某個執行緒在另一個執行緒t上呼叫t.join(), 此

Java 執行 CountDownLatch 試用

簡述: 使用Java多執行緒的庫,包括 ExecutorService執行緒池, CountDownLatch執行緒執行控制(知道所有啟動的執行緒呼叫完成後,函式才會繼續執行) package test.anialy.multithread; import java.ut

Java執行中Synchronized簡介和Static Synchronized的區別

在進行Java開發時,多執行緒的開發是經常會使用的。首先會問一個小問題啊,在Java中有幾種方法可以建立一個執行緒? 我給的答案是3種。(如果還有其他的請留言告訴我哈。) 1、建立直接繼承自Thread類建立執行緒子類。   步驟如下:a 定義一個子類,同時

Java執行學習與總結(Join)

join()方法的用法: join()是主執行緒 等待子執行緒的終止。也就是在子執行緒呼叫了 join() 方法後面的程式碼,只有等到子執行緒結束了才能執行。 例子如下: Java程式碼 p

Java執行學習與總結(ThreadGroup)

在Java中每個執行緒都屬於某個執行緒組(ThreadGroup)。例如,如果在main()中產生一個執行緒,則這個執行緒屬於main執行緒組管理的一員,您可以使用下面的指令來獲得目前執行緒所屬的執行緒組名稱: Java程式碼