查找有用的行情資料,學習更多百科知識
當前位置:首頁 » 資源管理 » 哪些操作會使得線程釋放資源
擴展閱讀
uzi鑲嵌鑽石多少克拉 2025-07-23 04:41:30

哪些操作會使得線程釋放資源

發布時間: 2022-08-03 02:42:53

『壹』 請教:多線程問題,子線程的佔用資源,什麼時候被釋放

子線程對象自己佔用的資源,在銷毀子線程對象時被釋放。
子線程運行過程中,程序中動態佔用的對象,在對象被銷毀時才能被釋放,不銷毀就不會釋放。

『貳』 伺服器經常崩潰是怎麼回事

伺服器崩潰的幾種原因第一:高並發流量或請求超過伺服器承受力
無論是企業和個人在租用伺服器的時候都會受到峰值承受限制的,一旦超過伺服器的承受能力,就會導致伺服器癱瘓,應用程序暫停,網站無法訪問。伺服器都是有峰值限制的,不可能承受無上限的並發能力。而造成伺服器癱瘓的原因就是在同一段時間內,訪問人數多,造成高流量的突進。超出了伺服器的承受范圍。這種例子我們經常可以看到,比如雙11期間,很多公司為了應對雙11的高流量,開啟的緊急避險措施和大規模的伺服器負載能力。還有春運期間,12306網站由於受到高並發的問題,也會頻繁的出現崩潰。
第二:磁碟空間不足
導致伺服器無法正常運行的原因也有可能是磁碟空間溢出導致的。企業的網路管理員應該實時關注磁碟的使用情況,並且要在規定的時間把磁碟儲存的數據備份到另外的存儲設備裡面,確保數據無遺失,推薦相關閱讀:哪些網站應該使用伺服器呢?
伺服器的磁碟大部分的資源都是被日誌文件佔用了,包括web伺服器,資料庫等日誌信息都包括其中,以及應用程序伺服器日誌文件均與內存泄漏是同等的危害。我們可以採取措施保護我們的數據和日誌文件,日誌文件對應用程序進行異地存儲。日誌文件系統空間如果滿了,則web伺服器將自動被掛起,但是機器本身癱瘓和宕機的幾率就會大大降低。
第三:伺服器超載
連接web伺服器都是用一個線程鏈接的,web伺服器會在線程用過之後自動掛起,不會再未已鏈接的線程提供任何服務。如果我們用了負載機制,那麼如果該伺服器沒有響應,則該伺服器的負載則會自動的轉移到其他web伺服器上,這個操作會使伺服器一個接一個的用光線程。這中操作可能會導致整個伺服器機組被掛起,操作系統同時還有可能在不斷接收新的鏈接,而我們的web伺服器無法未其提供服務,致使伺服器崩潰。
第四:伺服器遭到惡意攻擊
網路科技的不斷發展同時,黑客的技術和滲透也是很強的,伺服器和系統遭受到攻擊已經是普遍存在的了。所有伺服器都會面臨這個問題,這個是無法預測的危險,我們只能實時做好安全防護,將被攻擊的風險降至最低。

『叄』 在Java 中多線程的實現方法有哪些,如何使用

1、 認識Thread和Runnable

Java中實現多線程有兩種途徑:繼承Thread類或者實現Runnable介面。Runnable是介面,建議用介面的方式生成線程,因為介面可以實現多繼承,況且Runnable只有一個run方法,很適合繼承。在使用Thread的時候只需繼承Thread,並且new一個實例出來,調用start()方法即可以啟動一個線程。

Thread Test = new Thread();

Test.start();

在使用Runnable的時候需要先new一個實現Runnable的實例,之後啟動Thread即可。

Test impelements Runnable;

Test t = new Test();

Thread test = new Thread(t);

test.start();

總結:Thread和Runnable是實現java多線程的2種方式,runable是介面,thread是類,建議使用runable實現java多線程,不管如何,最終都需要通過thread.start()來使線程處於可運行狀態。

2、 認識Thread的start和run

1) start:

用start方法來啟動線程,真正實現了多線程運行,這時無需等待run方法體代碼執行完畢而直接繼續執行下面的代碼。通過調用Thread類的start()方法來啟動一個線程,這時此線程處於就緒(可運行)狀態,並沒有運行,一旦得到spu時間片,就開始執行run()方法,這里方法run()稱為線程體,它包含了要執行的這個線程的內容,Run方法運行結束,此線程隨即終止。

2) run:

run()方法只是類的一個普通方法而已,如果直接調用Run方法,程序中依然只有主線程這一個線程,其程序執行路徑還是只有一條,還是要順序執行,還是要等待run方法體執行完畢後才可繼續執行下面的代碼,這樣就沒有達到寫線程的目的。

總結:調用start方法方可啟動線程,而run方法只是thread的一個普通方法調用,還是在主線程里執行。

3、 線程狀態說明

線程狀態從大的方面來說,可歸結為:初始狀態、可運行狀態、不可運行狀態和消亡狀態,具體可細分為上圖所示7個狀態,說明如下:

1) 線程的實現有兩種方式,一是繼承Thread類,二是實現Runnable介面,但不管怎樣,當我們new了thread實例後,線程就進入了初始狀態;

2) 當該對象調用了start()方法,就進入可運行狀態;

3) 進入可運行狀態後,當該對象被操作系統選中,獲得CPU時間片就會進入運行狀態;

4) 進入運行狀態後case就比較多,大致有如下情形:

·run()方法或main()方法結束後,線程就進入終止狀態;

·當線程調用了自身的sleep()方法或其他線程的join()方法,就會進入阻塞狀態(該狀態既停止當前線程,但並不釋放所佔有的資源)。當sleep()結束或join()結束後,該線程進入可運行狀態,繼續等待OS分配時間片;

·當線程剛進入可運行狀態(注意,還沒運行),發現將要調用的資源被鎖牢(synchroniza,lock),將會立即進入鎖池狀態,等待獲取鎖標記(這時的鎖池裡也許已經有了其他線程在等待獲取鎖標記,這時它們處於隊列狀態,既先到先得),一旦線程獲得鎖標記後,就轉入可運行狀態,等待OS分配CPU時間片;

·當線程調用wait()方法後會進入等待隊列(進入這個狀態會釋放所佔有的所有資源,與阻塞狀態不同),進入這個狀態後,是不能自動喚醒的,必須依靠其他線程調用notify()或notifyAll()方法才能被喚醒(由於notify()只是喚醒一個線程,但我們由不能確定具體喚醒的是哪一個線程,也許我們需要喚醒的線程不能夠被喚醒,因此在實際使用時,一般都用notifyAll()方法,喚醒有所線程),線程被喚醒後會進入鎖池,等待獲取鎖標記。

·當線程調用stop方法,即可使線程進入消亡狀態,但是由於stop方法是不安全的,不鼓勵使用,大家可以通過run方法里的條件變通實現線程的stop。

『肆』 java線程結束會自動釋放資源,圖片中紅框框中的代碼是不是可以省略

ServerSocket中封裝了socket、bind、listen等操作,這些操作都是佔用系統內部資源的,如果不執行close,內部資源無法通過gc釋放,gc沒有傳說中那麼牛叉。

『伍』 如何手動釋放一個java線程佔用的資源

建議你聲明一個boolean變數替換while(true)中的true,因為這樣就可以控制線程了,然後不必等到主程序結束

『陸』 java中一個線程什麼時候釋放資源啊問題補充中是我情況的說明.

簡單的說,多線程是通過獲取CPU的片刻時間來實現的,多個線程其實不是同步的,只是他們的執行間隔太短,人幾乎感覺不到。這是基本概念。主線程(主體)在子線程未完成前事不會結束的,子線程(通過Thread產生的線程)start後,執行run()方法,執行run()後,該線程結束,系統自動釋放該線程佔用的資源,但主線程仍在運行!

『柒』 線程的狀態有哪些

線程的幾種狀態
線程在一定條件下,狀態會發生變化。線程一共有以下幾種狀態:

1、新建狀態(New):新創建了一個線程對象。

2、就緒狀態(Runnable):線程對象創建後,其他線程調用了該對象的start()方法。該狀態的線程位於「可運行線程池」中,變得可運行,只等待獲取CPU的使用權,

即在就緒狀態的進程除CPU之外,其它的運行所需資源都已全部獲得。

3、運行狀態(Running):就緒狀態的線程獲取了CPU,執行程序代碼。

4、阻塞狀態(Blocked):阻塞狀態是線程因為某種原因放棄CPU使用權,暫時停止運行。直到線程進入就緒狀態,才有機會轉到運行狀態。

阻塞的情況分三種:

①.等待阻塞:運行的線程執行wait()方法,該線程會釋放佔用的所有資源,JVM會把該線程放入「等待池」中。進入這個狀態後,是不能自動喚醒的,

必須依靠其他線程調用notify()或notifyAll()方法才能被喚醒,

②.同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程佔用,則JVM會把該線程放入「鎖池」中。

③.其他阻塞:運行的線程執行sleep()或join()方法,或者發出了I/O請求時,JVM會把該線程置為阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時,

或者I/O處理完畢時,線程重新轉入就緒狀態。

5、死亡狀態(Dead):線程執行完了或者因異常退出了run()方法,該線程結束生命周期。

線程變化的狀態轉換圖如下:

PS:拿到對象的鎖標記,即為獲得了對該對象(臨界區)的使用許可權。即該線程獲得了運行所需的資源,進入「就緒狀態」,只需獲得CPU,就可以運行。

因為當調用wait()後,線程會釋放掉它所佔有的「鎖標志」,所以線程只有在此獲取資源才能進入就緒狀態。

下面作下解釋:

①.線程的實現有兩種方式,一是繼承Thread類,二是實現Runnable介面,但不管怎樣, 當我們new了這個對象後,線程就進入了初始狀態;

②.當該對象調用了start()方法,就進入就緒狀態;

③.進入就緒後,當該對象被操作系統選中,獲得CPU時間片就會進入運行狀態;

④.進入運行狀態後情況就比較復雜;

(1)run()方法或main()方法結束後,線程就進入終止狀態;

(2)當線程調用了自身的sleep()方法或其他線程的join()方法,進程讓出CPU,然後就會進入阻塞狀態(該狀態既停止當前線程,但並不釋放所佔有的資源,

即調用sleep()函數後,線程不會釋放它的「鎖標志」。)。當sleep()結束或join()結束後,該線程進入可運行狀態,繼續等待OS分配CPU時間片;

典型地,sleep()被用在等待某個資源就緒的情形;測試發現條件不滿足後,讓線程阻塞一段時間後重新測試,直到條件滿足為止。

(3)線程調用了yield()方法,意思是放棄當前獲得的CPU時間片,回到就緒狀態,這時與其他進程處於同等競爭狀態,OS有可能會接著又讓這個進程進入運行狀態;

調用 yield() 的效果等價於調度程序認為該線程已執行了足夠的時間片從而需要轉到另一個線程。yield()只是使當前線程重新回到可執行狀態,

所以執行yield()的線程有可能在進入到可執行狀態後馬上又被執行。

(4)當線程剛進入可運行狀態(注意,還沒運行),發現將要調用的資源被synchroniza(同步),獲取不到鎖標記,將會立即進入鎖池狀態,等待獲取鎖標記

(這時的鎖池裡也許已經有了其他線程在等待獲取鎖標記,這時它們處於隊列狀態,既先到先得),一旦線程獲得鎖標記後,就轉入就緒狀態,等待OS分配CPU時間片。

(5)suspend() 和 resume()方法:兩個方法配套使用,suspend()使得線程進入阻塞狀態,並且不會自動恢復,必須其對應的resume()被調用,才能使得線程重新進入可執行狀態。

典型地,suspend()和 resume() 被用在等待另一個線程產生的結果的情形:測試發現結果還沒有產生後,讓線程阻塞,另一個線程產生了結果後,調用resume()使其恢復。

(6)wait()和 notify() 方法:當線程調用wait()方法後會進入等待隊列(進入這個狀態會釋放所佔有的所有資源,與阻塞狀態不同),進入這個狀態後,是不能自動喚醒的,

必須依靠其他線程調用notify()或notifyAll()方法才能被喚醒(由於notify()只是喚醒一個線程,但我們由不能確定具體喚醒的是哪一個線程,也許我們需要喚醒的線程不能夠被喚醒,

因此在實際使用時,一般都用notifyAll()方法,喚醒有所線程),線程被喚醒後會進入鎖池,等待獲取鎖標記。

wait() 使得線程進入阻塞狀態,它有兩種形式:

一種允許指定以ms為單位的時間作為參數,另一種沒有參數。前者當對應的notify()被調用或超出指定時間時線程重新進入可執行狀態即就緒狀態,後者則必須對應的notify()被調用。

當調用wait()後,線程會釋放掉它所佔有的「鎖標志」,從而使線程所在對象中的其它synchronized數據可被別的線程使用。

waite()和notify()因為會對對象的「鎖標志」進行操作,所以它們必須在synchronized函數或synchronizedblock中進行調用。

如果在non-synchronized函數或non-synchronizedblock中進行調用,雖然能編譯通過,但在運行時會發生IllegalMonitorStateException的異常。

『捌』 C# kill線程正常釋放資源

任何一個線程只要調用了exit都會導致進程結束,各種子線程當然也能很好的結束了,可是這種退出會有一個資源釋放的問題.我們知道當一個進程終止時,內核對該進程所有尚未關閉的文件描述符調用close關閉,所以即使用戶程序不調用close,在終止時內核也會自動關閉它打開的所有文件。沒錯,標准C++ IO流也會很好的在exit退出時得到flush並且釋放資源,這些東西並不會造成資源的浪費(系統調用main函數入口類似於exit(main(argc,argv))).表面上似乎所有的問題都能隨著進程的結束來得到很好的處理,其實並不然,我們程序從堆上分配的內存就不能得到很好的釋放,如new ,delete後的存儲空間,這些空間進程結束並不會幫你把這部分內存歸還給內存.(本文初稿時,因基礎不牢固,此處寫錯,事實上無論進程這樣結束,系統都將會釋放掉所有代碼所申請的資源,無論是堆上的還是棧上的。(感謝ZKey的指導)。這種結束所有線程(包括主線程)的方式實際上在很多時候是非常可取的,但是對於針對關閉時進行一些別的邏輯的處理(指非資源釋放邏輯)就不會很好,例如我想在程序被kill掉之前統計一下完成了多少的工作,這個統計類似於MapRece,需要去每個線程獲取,並且最後歸並程一個統一的結果等等場景)

『玖』 線程狀態有哪幾種

線程一共有以下幾種狀態:

1、新建狀態(New):新創建了一個線程對象。

2、就緒狀態(Runnable):線程對象創建後,其他線程調用了該對象的start()方法。該狀態的線程位於「可運行線程池」中,變得可運行,只等待獲取CPU的使用權。即在就緒狀態的進程除CPU之外,其它的運行所需資源都已全部獲得。

3、運行狀態(Running):就緒狀態的線程獲取了CPU,執行程序代碼。

4、阻塞狀態(Blocked):阻塞狀態是線程因為某種原因放棄CPU使用權,暫時停止運行。直到線程進入就緒狀態,才有機會轉到運行狀態。

阻塞的情況分三種:

(1)、等待阻塞:運行的線程執行wait()方法,該線程會釋放佔用的所有資源,JVM會把該線程放入「等待池」中。進入這個狀態後,是不能自動喚醒的,必須依靠其他線程調用notify()或notifyAll()方法才能被喚醒。

(2)、同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程佔用,則JVM會把該線程放入「鎖池」中。

(3)、其他阻塞:運行的線程執行sleep()或join()方法,或者發出了I/O請求時,JVM會把該線程置為阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉入就緒狀態。