国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

java基礎篇---線程問題

2019-11-14 22:57:41
字體:
來源:轉載
供稿:網友
java基礎篇---線程問題1:繼承 Thread 類,為什么要繼承 run 方法

答案: Thread 實現了 Runnable 接口,

而 run 方法是 Runnable 的方法, 接口中的方法默認 public abstract。 如果繼承 Thread 類,不重寫 run 方法 ,不會報錯 ,但是無法指定線程運行的代碼。

2:進程和線程的區別

答案:進程是具有一定獨立功能的程序關于某個數據集合上的一次運行活動,是系統進行資源分配和調度的一個獨立單位。線程是進程的一個實體,是 CPU 調度和分派的基本單位,他是比進程更小的能獨立運行的基本單位,線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),一個線程可以創建和撤銷另一個線程;進程和線程的關系:①一個線程只能屬于一個進程,而一個進程可以有多個線程,但至少有一個線程。②資源分配給進程,同一進程的所有線程共享該進程的所有資源。③線程在執行過程中,需要協作同步。不同進程的線程間要利用消息通信的辦法實現同步。④處理機分給線程,即真正在處理機上運行的是線程。⑤線程是指進程內的一個執行單元,也是進程內的可調度實體。線程與進程的區別:①調度:線程作為調度和分配的基本單位,進程作為擁有資源的基本單位。②并發性:不僅進程之間可以并發執行,同一個進程的多個線程之間也可以并發執行。③擁有資源:進程是擁有資源的一個獨立單位,線程不擁有系統資源,但可以訪問隸屬于進程的資源。④系統開銷:在創建或撤銷進程的時候,由于系統都要為之分配和回收資源,導致系統的明顯大于創建或撤銷線程時的開銷。但進程有獨立的地址空間,進程崩潰后,在保護模式下不會對其他的進程產生影響,而線程只是一個進程中的不同的執行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等于整個進程死掉,所以多進程的程序要比多線程的程序健壯,但是在進程切換時,耗費的資源較大,效率要差些。

線程的劃分尺度小于進程,使得多線程程序的并發性高。 另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大的提高了程序運行效率。線程在執行過程中,每個獨立的線程有一個程序運行的入口,順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,有應用程序提供多個線程執行控制。

從邏輯角度看,多線程的意義子啊與一個應用程序中,有多個執行部分可以同時執行。但操作系統并沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。

3:出現死鎖的條件

出現死鎖有 4 個必要條件: ①互斥:存在互斥使用的資源,也就是臨界資源; ②占有等待:擁有資源的進程都在等待另外的資源; ③非剝奪:進行所占有的資源是不可剝奪使用的資源; ④循環等待:都在相互等待資源。

4:Synchronized 鎖與 lock 鎖有什么區別

① synchronized 鎖只鎖括號里面的代碼內容,一個方法或者一個類等等。如果被鎖的代碼拋出異常會自動釋放鎖資源。

② lock 鎖鎖定 lock 和 unlock 之間的代碼,被鎖的代碼拋出異常不會自動釋放鎖資源,需要 try catch 后在 finally 里面手動 unlock 釋放鎖資源。

5:多線程中同步與鎖

Lock 替代了 synchronized;而 Condition 替代了 Object 中的監視器方法( wait,notify,notifyall)使用, Condition 可以通過 Lock 鎖獲取,一個 Lock 可以對應多個 Condition。

class Resource{PRivate String name; private int count = 1; private boolean flag = false;//定義標志,用于進程間切換 private Lock lock = new ReentrantLock(); private Condition con = lock.newCondition();//private Condition con_pro = lock.newCondition();//private Condition con_con = lock.newCondition();//此處拋了異常,在處理線程時一定要記得做異常處理 public void set(String name)throws InterruptedException{ lock.lock();//上鎖, lock()與 unlock()其實就類似于 synchronized ,只是 lock必須手動上鎖和解鎖 try{ while(flag) con.await();//線程等待,類似于 wait//con_pro.await(); this.name = name+"-->"+count++; System.out.println("生產者.."+this.name); flag = true; con.signalAll();//喚醒全部線程,類似于 notifyAll//con_con.signal();} finally{ lock.unlock();//釋放鎖 } }//此處拋了異常,在處理線程時一定要記得做異常處理 public void out()throws InterruptedException{ lock.lock();//上鎖 try{ while(!flag) con.await();//線程等待//con_con.await(); System.out.println("消費者.."+this.name); flag = false; con.signalAll();//喚醒線程//con_pro.signal(); } finally{ lock.unlock();//釋放鎖 } }}//以上注釋的代碼,實現了等待本方線程和只喚醒對方線程的功能。
6:多線程中 stop 為什么不合適

多線程之間一般是有聯系的,若用 stop 停止了線程,容易強行打斷線程之間的聯系,容易產生錯誤。

7:同步代碼塊和同步方法的區別

同步方法持有的鎖匙是 this,即本類對象。而同步代碼塊可以自定義一把鎖,語法為:synchronized(對象){同步內容},當然這個對象也可以是 this。同步代碼塊的作用域小于同步函數,而同步函數的作用域大于同步代碼塊,同步代碼塊效率相對更高。

8:Sleep 和 wait 的區別

①sleep 是 Thread 類中的, wait 是 Object 中的; ②sleep 會在指定時間之后自動喚醒, wait 需要其他線程調用 notify 或者 notifyAll 喚醒; ③sleep 還有個最大的特點就是誰調用,誰睡覺,即使在 a 類中調用 b 的 sleep 方法,實際上還是 a 去睡覺。④wait 只能使用在同步控制方法或者同步控制塊中使用, sleep 在任何地方都能被使用; ⑤持有鎖的線程執行 sleep,不釋放鎖,持有鎖的線程執行到 wait()時鎖釋放。

9:線程的五個狀態和特點

①新建狀態(New): 新創建了一個線程對象。②就緒狀態(Runnable): 線程對象創建后,其他線程調用了該對象的 start()方法.該狀態的線程位于可運行線程池中,變得可運行,等待獲取 CPU 的使用權.③運行狀態(Running): 就緒狀態的線程獲取了 CPU,執行程序代碼.④阻塞狀態(Blocked): 阻塞狀態是線程因為某種原因放棄CPU 使用權,暫時停止運行.直到線程進入就緒狀態,才有機會轉到運行狀態.阻塞的情況分三種: A)等待阻塞: 運行的線程執行 wait()方法,JVM 會把該線程放入等待池中。 B)同步阻塞: 運行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程占用,則 JVM 會把該線程放入鎖池中。 C)其他阻塞:運行的線程執行 sleep()或 join()方法,或者發出了 I/O 請求時,JVM 會把該線程置為阻塞狀態.當 sleep()狀態超時join()等待線程終止或者超時 或者 I/O 處理完畢時,線程重新轉入

10:同步函數鎖問題
public class Demon {//1.靜態方法同步函數 public static synchronized void method1(){}//2.非靜態方法同步 public synchronized void method2(){}//3.這個方法可以等價與靜態方法同步函數,即靜態方法同步函數省略了鎖為 Demon.class的靜態代碼塊,因為靜態方法是被類本身調用的,而每個類初始化的時候加載了 class 字節碼,所以鎖是 Demon.class public void method3(){ synchronized(Demon.class){} }//4 這個方法可以等價為非靜態方法同步函數,也就是非靜態方法底層的實現原理//注意這個時候,靜態代碼塊的鎖就是 this,因為函數需要被對象調用,那么函數都有一個所屬對象引用,所以用 this。 public void method4(){ synchronized(this){} }//需要同步的一般是多線程的情況,并且涉及到操作共享數據。}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 柳江县| 武汉市| 安化县| 沂水县| 额尔古纳市| 盐城市| 日土县| 福州市| 峨山| 成武县| 基隆市| 广德县| 富顺县| 仲巴县| 南和县| 鄂托克旗| 阳春市| 增城市| 南阳市| 惠水县| 永州市| 中阳县| 清水县| 于都县| 车致| 义马市| 当阳市| 洛川县| 友谊县| 双桥区| 凤城市| 始兴县| 广昌县| 沐川县| 离岛区| 广元市| 大石桥市| 双峰县| 壤塘县| 天台县| 米易县|