java多執行緒設定超時時間
情景:多執行緒中個別執行緒執行時間會很長,如果執行緒執行時間超過某段時間,自動結束該執行緒
百度了很多答案之後大部分的解決辦法都是利用Future類中的get(long timeout,TimeUnit unit) 方法進行設定,但是這個方法是阻塞的,在取不到結果之前是不會執行後邊的程式的。
下面程式碼是按照這個方法進行的測試:
預期結果:0到40都開始執行了之後,然後對執行緒進行超時判斷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開始時間: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程式碼