java 进程描述_java 进程和线程
什么是進程,什么是線程?
進程:是并發執行的程序在執行過程中分配和管理資源的基本單位,是一個動態概念,競爭計算機系統資源的基本單位。
線程:是進程的一個執行單元,是進程內科調度實體。比進程更小的獨立運行的基本單位。線程也被稱為輕量級進程。
一個程序至少一個進程,一個進程至少一個線程。
進程線程的區別:
1、地址空間:同一進程的線程共享本進程的地址空間,而進程之間則是獨立的地址空間。
2、資源擁有:同一進程內的線程共享本進程的資源,但是進程之間的資源是獨立的。
3、一個進程崩潰后,在保護模式下不會對其他進程產生影響,但是一個線程崩潰整個進程都死掉。所以多進程要比多線程健壯。
4、進程切換時,消耗的資源大,效率高。所以涉及到頻繁的切換時,使用線程要好于進程。同樣如果要求同時進行并且又要共享某些變量的并發操作,只能用線程不能用進程。
5、執行過程:每個獨立的進程程有一個程序運行的入口、順序執行序列和程序入口。但是線程不能獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
6、線程是處理器調度的基本單位,但是進程不是。
7、兩者均可并發執行。
優缺點:
線程執行開銷小,但是不利于資源的管理和保護。線程適合在SMP機器(雙CPU系統)上運行。
進程執行開銷大,但是能夠很好的進行資源管理和保護。進程可以跨機器前移。
什么地方會用到多線程?
1、后臺線程:比如定期執行一些特殊任務,如定期更新配置文件,任務調度,一些監控用于定期信息采集等。
2、最典型的應用比如tomcat,tomcat內部采用的就是多線程,上百個客戶端訪問同一個web應用,tomcat接入后都是把后續的處理扔給一個新的線程來處理,這個新的線程最后調用到我們的servlet程序,比如doGet或者doPost方法。還有就是需要異步處理的時候,需要使用多線程。
3、特別耗時的操作,如備份數據庫,可以開個線程執行備份,然后執行返回,前臺不斷向后臺詢問線程執行狀態。
多線程有幾種實現方法?有什么區別?
實現多線程有兩種方式:(自JDK1.5之后有三種,最后一種并不常用)
1.繼承Thread類
2.實現Runnable接口(Callable接口)
一個類如果實現了Runnable接口或者繼承了Thread類,那么它就是一個多線程類,如果是要實現多線程,還需要重寫run()方法,所以run() 方法是多線程的入口。
多線程的兩種實現方式的區別:
1.Thread是Runnable接口的子類,實現Runnable接口的方式解決了Java單繼承的局限
2.Runnable接口實現多線程比繼承Thread類更加能描述數據共享的概念
多線程有幾種實現同步方法?
同步的實現方面有兩種,分別是synchronized,wait與notify
wait():使一個線程處于等待狀態,并且釋放所持有的對象的lock。
sleep():使一個正在運行的線程處于睡眠狀態,是一個靜態方法,調用此方法要捕捉InterruptedException異常。
notify():喚醒一個處于等待狀態的線程,注意的是在調用此方法的時候,并不能確切的喚醒某一個等待狀態的線程,而是由JVM確定喚醒哪個線程,而且不是按優先級。
Allnotity():喚醒所有處入等待狀態的線程,注意并不是給所有喚醒線程一個對象的鎖,而是讓它們競爭。
產生死鎖的原因?
產生死鎖的四個必要條件:
1、互斥條件:一個資源每次只能被一個進程使用。
2、請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
3、不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。
4、循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。
避免死鎖
上面列出了死鎖的四個必要條件,我們只要想辦法破其中的任意一個或多個條件,就可以避免死鎖發生,一般有以下幾種方法:
1、按同一順序訪問對象。
2、避免事務中的用戶交互。
3、保持事務簡短并處于一個批處理中。
4、使用較低的隔離級別。
5、使用基于行版本控制的隔離級別。
6、使用綁定連接。
以上就是有關進程和線程的總結,有什么好的意見歡迎大家留言。
總結
以上是生活随笔為你收集整理的java 进程描述_java 进程和线程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fiddler自动保存mysql_Fid
- 下一篇: java 素数 五行_【数论】素数的判定