導航:首頁 > 編程語言 > java線程周期

java線程周期

發布時間:2022-10-24 07:00:08

java線程的幾種狀態

線程是一個動態執行的過程,它有一個從產生到死亡的過程,共五種狀態:

1、新建(new Thread)

當創建Thread類的一個實例(對象)時,此線程進入新建狀態(未被啟動)

例如:Thread t1=new Thread();

2、就緒(runnable)

線程已經被啟動,正在等待被分配給CPU時間片,也就是說此時線程正在就緒隊列中排隊等候得到CPU資源。例如:t1.start();

3、運行(running)

線程獲得CPU資源正在執行任務(run()方法),此時除非此線程自動放棄CPU資源或者有優先順序更高的線程進入,線程將一直運行到結束。

4、堵塞(blocked)

由於某種原因導致正在運行的線程讓出CPU並暫停自己的執行,即進入堵塞狀態。

5、死亡(dead)

當線程執行完畢或被其它線程殺死,線程就進入死亡狀態,這時線程不可能再進入就緒狀態等待執行。

⑵ java 線程組和線程池的作用

一個線程的周期分為:創建、運行、銷毀三個階段。處理一個任務時,首先創建一個任務線程,然後執行任務,完了,銷毀線程。而線程處於運行狀態的時候,才是真的在處理我們交給它的任務,這個階段才是有效運行時間。所以,我們希望花在創建和銷毀線程的資源越少越好。如果不銷毀線程,而這個線程又不能被其他的任務調用,那麼就會出現資源的浪費。為了提高效率,減少創建和銷毀線程帶來時間和空間上的浪費,出現了線程池技術。這種技術是在開始就創建一定量的線程,批量處理一類任務,等待任務的到來。任務執行完畢後,線程又可以執行其他的任務。等不再需要線程的時候,就銷毀。這樣就省去了頻繁創建和銷毀線程的麻煩。

⑶ JAVA中,線程有哪五個基本狀態他們之間如何讓轉化並簡述線程周期。

java中,每個線程都需經歷新生、就緒、運行、阻塞和死亡五種狀態,線程從新生到死亡的狀態變化稱為生命周期。
用new運算符和Thread類或其子類建立一個線程對象後,該線程就處於新生狀態。



⑷ JAVA線程的機制有哪些

Java的線程機制 摘 要: 多線程機制是Java的重要技術,闡述了線程和進程的差別;Java中線程4個狀態之間的轉換;並結合例子說明了兩種創建線程的方法。 線程是指程序中能順序執行的一個序列。一個線程只有一個入口點� 但可能有幾個出口點� 不過,每個時刻的執行點總是只有一個。線程是不能獨立運行的程序,而只是某個整體程序內部的一個順序執行流。 多線程是Java的一個重要特點。如果一個程序是單線程的,那麼,任何時刻都只有一個執行點。這種單線程執行方法使系統運行效率低,而且,由於必須依靠中斷來處理輸入/輸出。所以,當出現頻繁輸入/輸出或者有優先順序較低的中斷請求時,實時性就變得很差。多線程系統可以避免這個缺點。所謂多線程,就是通過系統的調度使幾個具有不同功能的程序流即線程同時並行地運行。 在單處理器計算機系統中,實際上是不可能使多個線程真正並行運行的,而要通過系統用極短的時間、極快的速度對多個線程進行切換,宏觀上形成多個線程並發執行的效果。 1 線程和進程機制上的差別 線程和進程很相象,它們都是程序的一個順序執行序列,但兩者又有區別。進程是一個實體,每個進程有自己獨立的狀態,並有自己的專用數據段,創建進程時, 必須建立和復制其專用數據段,線程則互相共享數據段。同一個程序中的所有線程只有一個數據段, 所以, 創建線程時不必重新建立和復制數據段。由於數據段建立和復制這方面的差異,使線程的建立和線程間的切換速度大大優於進程,另一方面,線程又具備進程的大多數優點。 假設銀行系統辦理存款和取款手續,將帳本看成數據段。如果按進程這種機制,那麼,當儲戶去存/取款時,銀行應先把帳本復制一遍,為儲戶建立一個獨立的帳本再結算。如果按線程機制, 那麼,銀行里所有的出納員都用同一個帳本,儲戶來辦存/取款時,也從這個帳本直接結算。用線程機制省去了數據段復制這一步顯然是線程獨具的特點。 由於多個線程共享一個數據段,所以,也出現了數據訪問過程的互斥和同步問題,這使系統管理功能變得相對復雜。 總的來說,一個多線程系統在提高系統的輸入/輸出速度、有效利用系統資源、改善計算機通信功能以及發揮多處理器硬體功能方面顯示了很大優勢。因此,一些最新的操作系統如Windows95、Windows98、Windows NT等都提供了對多線程的支持。但是,在多線程操作系統下設計多線程的程序仍然是一個比較復雜和困難的工作。由於需要解決對數據段的共享,所以,原則上應該從程序設計角度採用加鎖和釋放措施,稍有不慎,便會使系統產生管理上的混亂。 而Java從語言一級提供對多線程的支持,這樣,可由語言和運行系統聯合提供對共享數據段的管理功能和同步機制,使得多線程並行程序設計相對比較容易。 2 Java線程的生命周期 每個線程都是和生命周期相聯系的,一個生命周期含有多個狀態,這些狀態間可以互相轉化。 Java的線程的生命周期可以分為4個狀態;創建(new)狀態;可運行(runnable)狀態;不執行(notrunnable)狀態;消亡(dead)狀態。 創建狀態是指創建一個線程對應的對象的過程,Java系統中,些對象都是從Java.lang包內一個稱為Thread的類用關鍵字new創建的。剛創建的線程不能執行,必須向系統進行注冊、分配必要的資源後才能進入可運行狀態,這個步驟是由start操作完成的,而處於可運行狀態的線程也未必一定處於運行中,它有可能由於外部的I/O請求而處於不運行狀態。進入消亡狀態後,此線程就不再存在了。 一個線程創建之後,總是處於其生命周期的4個狀態之一中,線程的狀態表明此線程當前正在進行的活動,而線程的狀態是可以通過程序來進行控制的,就是說,可以對線程進行操作來改變狀態。 這些操作包括啟動(start)、終止(stop)、睡眠(sleep)、掛起(suspend)、恢復(resume)、等待(wait)和通知(notify)。每一個操作都對應了一個方法� 這些方法是由軟體包Java.lang提供的。通過各種操作,線程的4個狀態之間可按圖1所示進行轉換。 2.1 創建(new)狀態 如果創建了一個線程而沒有啟動它,那麼,此線程就處於創建狀態。比如,下述語句執行以後,使系統有了一個處於創建狀態的線程myThread:� Thread myThread=new MyThreadClass(); 其中,MyThreadClass()是Thread的子類,而Thread是由Java系統的Java.lang軟體包提供的。處於創建狀態的線程還沒有獲得應有的資源,所以,這是一個空的線程,線程只有通過啟動後,系統才會為它分配資源。對處於創建狀態的線程可以進行兩種操作: 一是啟動(start)操作,使其進入可運行狀態;二是終止(stop)操作,使其進入消亡狀態。如果進入到消亡狀態,那麼,此後這個線程就不能進入其它狀態,也就是說,它不復存在了。 start方法是對應啟動操作的方法,其具體功能是為線程分配必要的系統資源,將線程設置為可運行狀態,從而可以使系統調度這個線程。 2.2 可運行(runnable)狀態 如果對一個處於創建狀態的線程進行啟動操作,則此線程便進入可運行狀態。比如,用下列語句� myThread.start();� � 則使線程myThread進入可運行狀態。上述語句實質上是調用了線程體即run()方法,注意,run()方法包含在myThread線程中,也就是先由java.lang包的Thread類將run()方法傳遞給子類MyThreadClass(),再通過創建線程由子類MyThreadClass,傳遞給線程myThread。 線程處於可運行狀態只說明它具備了運行條件,但可運行狀態並不一定是運行狀態,因為在單處理器系統中運行多線程程序,實際上在一個時間點只有一個線程在運行,而系統中往往有多個線程同時處於可運行狀態,系統通過快速切換和調度使所有可運行線程共享處理器,造成宏觀上的多線程並發運行。可見,一個線程是否處於運行狀, 除了必須處於可運行狀態外,還取決於系統的調度。 在可運行狀態可以進行多種操作,最通常的是從run()方法正常退出而使線程結束,進入消亡狀態。 此, 還可以有如下操作� 掛起操作,通過調用suspend方法來實現; 睡眠操作,通過調用sleep方法來實現; 等待操作,通過調用wait方法來實現; 退讓操作,通過調用yield方法來實現; 終止操作,通過調用stop方法來實現。 前面三種操作都會使一個處於可運行狀態的線程進入不可運行狀態。比如,仍以myThread線程為例,當其處於可運行狀態後,再用如下語句� myThread.sleep (5000); 則調用sleep方法使myThread線程睡眠5s(5000ms)。這5s內,此線程不能被系統調度運行,只有過5s後,myThread線程才會醒來並自動回到可運行狀態。 如果一個線程被執行掛起操作而轉到不可運行狀態,則必須通過調用恢復(resume)操作,才能使這個線程再回到可運行狀態。 退讓操作是使某個線程把CPU控制權提前轉交給同級優先權的其他線程。 對可運行狀態的線程也可以通過調用stop方法使其進入消亡狀態。 2.3 不可運行(not runnable)狀態 不可運行狀態都是由可運行狀態轉變來的。一個處於可運行狀態的線程,如果遇到掛起(suspend)操作、睡眠(sleep)操作或者等待(wait)操作,就會進入不可運行狀態。 另外,如果一個線程是和I/O操作有關的,那麼,在執行I/O指令時,由於外設速度遠遠低於處理器速度而使線程受到阻, 從而進入不可運行狀態,只有外設完成輸入/輸出之後,才會自動回到可運行狀態。線程進入不可運行狀態後,還可以再回到可運行狀態,通常有三種途徑使其恢復到可運行狀態。 一是自動恢復。通過睡眠(sleep)操作進入不可運行狀態的線程會在過了指定睡眠時間以後自動恢復到可運行狀態,由於I/O阻塞而進入不可運行狀態的線程在外設完成I/O操作後,自動恢復到可運行狀態。 二是用恢復(resume)方法使其恢復。如果一個線程由於掛起(suspend)操作而從可運行狀態進入不可運行狀態,那麼,必須用恢復(resume)操作使其再恢復到可運行狀態。 三是用通知(notify或notifyAll)方法使其恢復。如果一個處於可運行狀態的線程由於等待(wait)操作而轉入不可運行狀態,那麼,必須通過調用notify方法或notifyAll方法才能使其恢復到可運行狀態,採用等待操作往往是由於線程需要等待某個條件變數,當獲得此條件變數後,便可由notify或ontifyAll方法使線程恢復到可運行狀態。 恢復到可運行狀態的每一種途徑都是有針對性的,不能交叉。比如,對由於阻塞而進入不可運行狀態的線程採用恢復操作將是無效的。 在不可運行狀態,也可由終止(stop)操作使其進入消亡狀態。 2.4 消亡(dead)狀態 一個線程可以由其他任何一個狀態通過終止(stop)操作而進入消亡狀態。 線程一旦進入消亡狀態,那它就不再存在了,所以也不可能再轉到其它狀態。 通常,在一個應用程序運行時,如果通過其它外部命令終止當前應用程序,那麼就會調用(stop)方法終止線程。但是,最正常、最常見的途徑是由於線程在可運行狀態正常完成自身的任務而″壽終正寢″,從而進入消亡狀態,這個完成任務的動作是由run方法實現的。 3 Java線程的兩種創建途徑 一種途徑是通過對Thread的繼承來派生一個子類,再由此子類生成一個對象來實現線程的創建,這是比較簡單直接的辦法。Thread類包含在系統API提供的8個軟體包之一Java.lang中,Thread類中包含了很多與線程有關的方, 其中,一個名為run的方法就是用來實現線程行為的。比如:� 1 import java.lang.*� //引用lang包 2 class Mango exteds Thread { 3 public void run() { 4 ...... 5 �} 6 �} 上述程序段中,第1行語句引用軟體包lang,這樣做是為了給編譯器一個信息,從而使後面程序中有關lang包中的方法可直接用方法名,而不必帶前綴「Java.lang」。第2行語句是從lang包Thread派生一個子類Mango, 而這個子類中提供了run方法的實現,這樣,運行時,將由子類Mango 的 run方法置換父類Thread的run方法。 不過這一步還沒有創建線, 必須由子類生成一個對象,並且進行啟動操作,這樣才能得到一個處於可運行狀態的線程。生成對象其實就是完成線程的創建,而啟動是對已創建的線程進行操作。具體語句如下:� Mango t=new Mango(); � t.start(); � 上面先用關鍵字new使線程進入創建狀態,又調用start()方法使線程進入可運行狀態。注意,start()方法是由Thread繼承給子類Mango、然後又在生成對象時由對象t從類Mango得到的。 另一種途徑是通過一個類去繼承介面runnable來實現線程的創建� 而這個類必須提供runnable介面中定義的方法run()的實現。runnable是Java.lang包中的一個介面,在runnable介面中,只定義了一個抽象方法run()。所以,如用這種途徑來創建線程,則應先由一個類連接介面runnable,並且提供run()方法的實現。比如,下面的程序段實現了與介面的連接。 1 public class xyz implements Runnable{ 2 int i; � 3 public voed run(){ 4 while (true){ � 5 System.out.println("Hello"+i++); 6 � } 7 � } 8 � } 然後再創建一個線程� runnable r=new xyz(); � Thread t=new Thread(r); 這種途徑創建線程比第一種途徑靈活。當一個類既需要繼承一個父類又要由此創建一個線程時,由於Java不支持多重繼承,這樣,用第一種途徑將行不通,因為,按此思路創建線程也是以繼承的方法實現的。 於是,就需要一個類既繼承Thread類,又繼承另一個父類。但用介面方法卻能實現這個目標。 4 線程的啟動和終止 Thread的start()方法對應於啟動操作,它完成兩方面的功能:一方面是為線程分配必要的資源,使線程處於可運行狀態,另一方面是調用線程的run()方法置換Thread的中run()方法或者置換runnable中的run()方法來運行線程。 使用start()方法的語句很簡單,即: ThreadName.start(); 下面的程序段先創建並啟動線程myThread, 然後使用sleep()方法讓其睡眠20000ms即20s,使其處於不可運行狀態,過20s後,線程又自動恢復到可運行狀態。 Thread MyThread=new MyThreadClass(); MyThread.start();� � try{ � MyThread.sleep(20000); �} catch(InterrujptedException e){ }

⑸ 如何使用Java實現周期性操作

import java.util.TimerTask;public class HeartBeatTask extends TimerTask {private int timerInterval;public HeartBeatTask(int timeInterval){this.timerInterval=timeInterval;}public void run() {// 在這里添加你需要周期性運行的代碼System.out.println("Welcome");}public static void main(String[] args ){java.util.Timer t1 = new java.util.Timer();HeartBeatTask tt = new HeartBeatTask(3000);t1.schele(tt, 0, 3000);}}TimerTask protected TimerTask() 創建一個新的計時器任務。run public abstract void run() 此計時器任務要執行的操作。 public class TimerextendsObject一種工具,線程用其安排以後在後台線程中執行的任務。可安排任務執行一次,或者定期重復執行。與每個 Timer 對象相對應的是單個後台線程,用於順序地執行所有計時器任務。計時器任務應該迅速完成。如果完成某個計時器任務的時間太長,那麼它會「獨占」計時器的任務執行線程。因此,這就可能延遲後續任務的執行,而這些任務就可能「堆在一起」,並且在上述不友好的任務最終完成時才能夠被快速連續地執行。對Timer 對象最後的引用完成後,並且 所有未處理的任務都已執行完成後,計時器的任務執行線程會正常終止(並且成為垃圾回收的對象)。但是這可能要很長時間後才發生。默認情況下,任務執行線程並不作為守護線程 來運行,所以它能夠阻止應用程序終止。如果調用者想要快速終止計時器的任務執行線程,那麼調用者應該調用計時器的 cancel 方法。如果意外終止了計時器的任務執行線程,例如調用了它的 stop 方法,那麼所有以後對該計時器安排任務的嘗試都將導致 IllegalStateException,就好像調用了計時器的 cancel 方法一樣。此類是線程安全的:多個線程可以共享單個 Timer 對象而無需進行外部同步。此類不 提供實時保證:它使用 Object.wait(long) 方法來安排任務。 實現注意事項:此類可擴展到大量同時安排的任務(存在數千個都沒有問題)。在內部,它使用二進制堆來表示其任務隊列,所以安排任務的開銷是 O(log n),其中 n 是同時安排的任務數。實現注意事項:所有構造方法都啟動計時器線程。Timer public Timer() 創建一個新計時器。 schele public void schele(TimerTask task, long delay, long period) 安排指定的任務從指定的延遲後開始進行重復的固定延遲執行。以近似固定的時間間隔(由指定的周期分隔)進行後續執行。
在固定延遲執行中,根據前一次執行的實際執行時間來安排每次執行。如果由於任何原因(如垃圾回收或其他後台活動)而延遲了某次執行,則後續執行也將被延遲。從長期來看,執行的頻率一般要稍慢於指定周期的倒數(假定 Object.wait(long) 所依靠的系統時鍾是准確的)。 固定延遲執行適用於那些需要「平穩」運行的重復活動。換句話說,它適用於在短期運行中保持頻率准確要比在長期運行中更為重要的活動。這包括大多數動畫任務,如以固定時間間隔閃爍的游標。這還包括為響應人類活動所執行的固定活動,如在按住鍵時自動重復輸入字元。 參數:task - 所要安排的任務。delay - 執行任務前的延遲時間,單位是毫秒。period - 執行各後續任務之間的時間間隔,單位是毫秒。拋出:IllegalArgumentException - 如果 delay 是負數,或者 delay + System.currentTimeMillis() 是負數。IllegalStateException - 如果已經安排或取消了任務,已經取消了計時器,或者計時器線程已終止。 public void schele(TimerTask task, Date firstTime, long period) 安排指定的任務在指定的時間開始進行重復的固定延遲執行。以近似固定的時間間隔(由指定的周期分隔)進行後續執行。
在固定延遲執行中,根據前一次執行的實際執行時間來安排每次執行。如果由於任何原因(如垃圾回收或其他後台活動)而延遲了某次執行,則後續執行也將被延遲。在長期運行中,執行的頻率一般要稍慢於指定周期的倒數(假定 Object.wait(long) 所依靠的系統時鍾是准確的)。 固定延遲執行適用於那些需要「平穩」運行的重復執行活動。換句話說,它適用於在短期運行中保持頻率准確要比在長期運行中更為重要的活動。這包括大多數動畫任務,如以固定時間間隔閃爍的游標。這還包括為響應人類活動所執行的固定活動,如在按住鍵時自動重復輸入字元。 參數:task - 所要安排的任務。firstTime - 首次執行任務的時間。period - 執行各後續任務之間的時間間隔,單位是毫秒。拋出:IllegalArgumentException - 如果 time.getTime() 是負數。

⑹ 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線程周期相關的資料

熱點內容
安卓如何安裝obb 瀏覽:440
QQ聊天記錄journal文件夾 瀏覽:118
蘋果公司雲伺服器地址 瀏覽:85
加密記事本手機 瀏覽:437
汽車壓縮機變頻閥 瀏覽:95
域外伺服器是什麼意思 瀏覽:639
大眾點評伺服器怎麼老卡頓 瀏覽:556
javavector與list的區別 瀏覽:316
java初始化類數組 瀏覽:303
java字元串轉換成json對象 瀏覽:647
android非阻塞socket 瀏覽:358
編譯系統概念 瀏覽:452
天眼通app能做什麼 瀏覽:557
魅族手機怎麼加密圖庫 瀏覽:8
rpa編譯器 瀏覽:572
車載雲伺服器記錄 瀏覽:740
四川金星壓縮機製造有限公司 瀏覽:55
移動平台圖片壓縮演算法 瀏覽:37
銀行項目java 瀏覽:571
怎樣將pdf轉換為ppt 瀏覽:598