當前位置:首頁 » 編程語言 » java線程超時

java線程超時

發布時間: 2022-07-09 01:23:14

① 基於java 線程的幾種狀態

下面是java 線程的5種狀態:

1、新建(new)

新建一個線程的對象。

2、可運行(runable)

線程對象創建後,其他線程調用該線程的start方法。或者該線程位於可運行線程池中等待被線程調用,已獲取cpu的使用權。

3、運行(running)

可運行的線程獲取了cpu的使用權,執行程序代碼

4、阻塞(block)

由於某些原因該線程放棄了cpu的使用權。停止執行。除非線程進入可運行的狀態,才會有機會獲取cpu的使用權。

(1)等待阻塞:運行中的線程執行wait方法,這時候該線程會被放入等待隊列。

(2)同步阻塞:運行中的線程獲取同步鎖,如果該同步鎖被別的線程佔用,這個線程會成被放入鎖池,等待其他線程釋放同步鎖。

(3)其他阻塞:運行的線程執行sleep或者join方法這個線程會成為阻塞狀態。當sleep超時,join等待線程終止,該線程會進入可運行狀態。

5、死亡(dead)

線程run mian 執行完畢後,或者因為某些異常產生退出了 run 方法,該線程的生命周期結束。

② java線程池裡的線程,怎麼設置Timeout

應該是沒有這個功能的,因為線程池裡面的線程實際上是復用的,即執行完一個Job以後會從Quenue(任務隊列)裡面取新的JOB。

如果有這樣的需求可以:
1)控制JOB的執行時間不能太長,否則可能會造成阻塞;
2)在JOB的實現(run方法)裡面做相應的控制;
3)如果JOB有長時間和短時間兩種模式,可以考慮放在兩個線程池中,避免長時間的任務阻塞短時間的任務;
4)也可以控制等待隊列的任務個數,但是Executors默認的Factory方法是沒有這個參數的,需要直接new ThreadPoolExecutor

③ java 線程池中正在運行的線程 如何設置超時時間 ps:如何設置一個線程最長的運行時間。

你可以設置一個計時器,然後把線程對象給它,讓計時器在恰當時候把線程對象終止

④ Java線程超時管理

如果你是要在子線程超時後直接關閉的話可以這樣:
exec=Executors.newFixedThreadPool(1);
Callable<String> call = new Callable<String>() {
public String call() throws Exception {
//開始操作

//TimeTaskTest.star(null);
return "線程執行完成";
}
};
Future<String> future = exec.submit(call);
//設置為30分鍾超時
future.get(1000*60*time , TimeUnit.MILLISECONDS);
=========================================
如果你是在進行其他操作的話那就比較麻煩了,目前我想到的是在子線程中一直訪問某個變數,超時時守護線程改變這個值,然後子線程讀到後退出,不過這個有個問題,就是當子線程卡死在某個環節時完全無用

⑤ java使用線程操作,等待線程後續時間過長報超時異常,如何操作使線程推出數據後即算線程操作結束

java中使用用線程式控制制Task任務,啟動下面的線程就可以了,new Thread(new Task()).start() ;public class
Task implements Runnable {//新建一個任務
private TextArea textArea;

public Task(TextArea textArea){
this.textArea = textArea;
}
public void run() {
while (true) {
this.textArea.setText("這里設置: 輸出的一段文字");

try {
Thread.sleep(500); // 這里設置:隔多長時間
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

⑥ java 線程有哪些狀態,這些狀態之間是如何轉化的

線程在它的生命周期中會處於各種不同的狀態:
新建、等待、就緒、運行、阻塞、死亡。
1 新建
用new語句創建的線程對象處於新建狀態,此時它和其他java對象一樣,僅被分配了內存。
2等待
當線程在new之後,並且在調用start方法前,線程處於等待狀態。
3 就緒
當一個線程對象創建後,其他線程調用它的start()方法,該線程就進入就緒狀態。處於這個狀態的線程位於Java虛擬機的可運行池中,等待cpu的使用權。
4 運行狀態
處於這個狀態的線程佔用CPU,執行程序代碼。在並發運行環境中,如果計算機只有一個CPU,那麼任何時刻只會有一個線程處於這個狀態。
只有處於就緒狀態的線程才有機會轉到運行狀態。
5 阻塞狀態
阻塞狀態是指線程因為某些原因放棄CPU,暫時停止運行。當線程處於阻塞狀態時,Java虛擬機不會給線程分配CPU,直到線程重新進入就緒狀態,它才會有機會獲得運行狀態。
6 死亡狀態
當線程執行完run()方法中的代碼,或者遇到了未捕獲的異常,就會退出run()方法,此時就進入死亡狀態,該線程結束生命周期。

由於java線程調度不是分時的,如果程序希望干預java虛擬機對線程的調度過程,從而明確地讓一個線程給另外一個線程運行的機會,可以採用以下的方法
1 調整各個線程的優先順序
2 讓處於運行狀態的線程調用Thread.sleep(long time)方法 放棄CPU 進入阻塞狀態。
sleep方法可能拋出InterruptedException
線程休眠後只能在指定的時間後使線程處於就緒狀態。(也就是等待cpu的調度)
3 讓處於運行狀態的線程調用Thread.yield()方法 只會同優先順序讓步或更高優先順序讓步,進入就緒狀態。
4 讓處於運行狀態的線程調用另一個線程的join()方法
當前運行的線程可以調用另一個線程的join()方法,當前運行的線程將轉到阻塞狀態,直至另一個線程運行結束,它才會轉到就緒狀態 從而有機會恢復運行。

通過一下幾種途徑中的一種,線程可以從被阻塞狀態到可運行狀態。
1 線程被置於睡眠狀態,且已經經過指定的毫秒數。
2 線程正在等待I/O操作的完成,且該操作已經完成。
3 線程正在等待另一個線程所持有的鎖,且另一個線程已經釋放該鎖的所有權;(也有可能等待超時。當超時發生時,線程解除阻塞。)
4 線程正在等待某個觸發條件,且另一個線程發出了信號表明條件已經發生了變化。(如果為線程的等待設置了一個超時,那麼當超時發生時該線程將解除阻塞。)
5 線程已經被掛起,且有人調用了它的resume方法。不過,由於suspend方法已經過時,resume方法也就隨之被棄用了,你不應該在自己的代碼里調用它。(現在應該用sleep取而代之。)

⑦ java的timer類如何判斷程序超時呢

參照如下的:
Timer類是用來執行任務的類,它接受一個TimerTask做參數
TimerTask是個抽象類,他擴展了Object並實現了Runnable介面,因此你必須在自己的Task中實現publicvoid run()方法。這也就是我們需要執行的具體任務。

Timer有兩種執行任務的模式,最常用的是schele,它可以以兩種方式執行任務:1:在某個時間(Data),2:在某個固定的時間之後(intdelay).這兩種方式都可以指定任務執行的頻率

我們指定一個線程A,調用對象B.wait(timeout),線程A就會阻塞,直到timeout到了,B醒來會使A繼續執行。
其實Timer類是為多任務定時設計的,在實現裡面,B是一個任務隊列(實現上就是一個array),維護著所有使用當前Timer定時的任務,它們可是一堆貨真價實的線程實例。每次線程A都取隊列中距離當前時間最近的的定時任務,跟當前時間比較,然後wait(timeout)這段時間。線程喚醒的時刻也是隊列中這個定時任務運行的時刻。然後線程繼續取下一個定時任務,繼續wait(timeout)。從這里我們能看出來,每次定時都有額外的時間開銷,比如要維護隊列等,所以Java的Timer類不保證實時。
Timer中最主要由三個部分組成:
任務TimerTask 、 任務隊列: TaskQueue queue 和 任務調試者:TimerThreadthread

Timer對任務的調度是基於絕對時間的。
所有的TimerTask只有一個線程TimerThread來執行,因此同一時刻只有一個TimerTask在執行。
任何一個TimerTask的執行異常都會導致Timer終止所有任務。
由於基於絕對時間並且是單線程執行,因此在多個任務調度時,長時間執行的任務被執行後有可能導致短時間任務快速在短時間內被執行多次或者乾脆丟棄多個任務。
由於Timer/TimerTask有這些特點(缺陷),因此這就導致了需要一個更加完善的任務調度框架來解決這些問題。

默認情況下,只要一個程序的timer線程在運行,那麼這個程序就會保持運行。當然,你可以通過以下四種方法終止一個timer線程:
調用timer的cancle方法。你可以從程序的任何地方調用此方法,甚至在一個timertask的run方法里。
讓timer線程成為一個daemon線程(可以在創建timer時使用newTimer(true)達到這個目地),這樣當程序只有daemon線程的時候,它就會自動終止運行。
當timer相關的所有task執行完畢以後,刪除所有此timer對象的引用(置成null),這樣timer線程也會終止。
調用System.exit方法,使整個程序(所有線程)終止。

⑧ Java中如何實現線程的超時中斷

如果你是要在子線程超時後直接關閉的話可以這樣:
exec=Executors.newFixedThreadPool(1);
Callable<String> call = new Callable<String>() {
public String call() throws Exception {
//開始操作

//TimeTaskTest.star(null);
return "線程執行完成";
}
};
Future<String> future = exec.submit(call);
//設置為30分鍾超時
future.get(1000*60*time , TimeUnit.MILLISECONDS);
=========================================
如果你是在進行其他操作的話那就比較麻煩了,目前我想到的是在子線程中一直訪問某個變數,超時時守護線程改變這個值,然後子線程讀到後退出,不過這個有個問題,就是當子線程卡死在某個環節時完全無用

熱點內容
滑板鞋腳本視頻 發布:2025-02-02 09:48:54 瀏覽:432
群暉怎麼玩安卓模擬器 發布:2025-02-02 09:45:23 瀏覽:557
三星安卓12彩蛋怎麼玩 發布:2025-02-02 09:44:39 瀏覽:743
電腦顯示連接伺服器錯誤 發布:2025-02-02 09:24:10 瀏覽:537
瑞芯微開發板編譯 發布:2025-02-02 09:22:54 瀏覽:146
linux虛擬機用gcc編譯時顯示錯誤 發布:2025-02-02 09:14:01 瀏覽:235
java駝峰 發布:2025-02-02 09:13:26 瀏覽:651
魔獸腳本怎麼用 發布:2025-02-02 09:10:28 瀏覽:538
linuxadobe 發布:2025-02-02 09:09:43 瀏覽:212
sql2000資料庫連接 發布:2025-02-02 09:09:43 瀏覽:726