併發的解決的問題:
速度
設計可管理性
更快的執行
併發可以提高在單處理器上的程序性能;
實現併發最直接的方式是在操作系統級別使用進程;
- 週期性的將CPU從一個進程切換到另一個進程;
- 但是JAVA使用的併發系統會共享內存和I/O這樣的資源,所以必須要協調不同驅動線程任務對這些資源的使用;
線程機制
- 機制:切分CPU時間,子線程都能分配到一定的時間執行任務;
- 好處:CPU的個數可以任意擴展,與實際的線程代碼運行無關;
Thread
- 讓步:Thread.yield():在run()方法中調用Thread.yield()方法是對線程調度器的一種建議;
- 線程調度器:Java線程機制的一部分,可以將CPU從一個線程轉移給另一個線程;
- 暗示可以交給別的同樣優先級的線程運行;
- 可以看到任務換進換出的證據;
- 執行:run():導出Runnable類的時候必須要有一個run()方法,這個方法不會產生任何內在的線程能力,要實現線程行爲,必須顯示的將一個任務附着到線程上;
優先級
- 設置優先級:在run()方法的開頭處,Thread.currentThread().setPriority(int priority) ;
- 實際原理:提高頻率(實際優先分配時間片);
- 常用級別:MAX_PRIORITY,NORM_PRIORITY,MIN_PRIORITY;
後臺線程(daemon)
- 定義:程序在運行的過程中在後臺提供的一種通用服務的線程,這種線程並不能成爲程序不可獲取的部分;
- 理解:如果非後臺線程死了,那麼後臺線程也就會被殺死;
- 設置:在啓動(start())方法之前,調用threadSymbol(實現了runnable接口的一個線程實例).setDaemon(true);
- 判斷:isDaemon();
加入一個線程(join)
- 定義:如果一個線程在另一個線程t上調用t.join(),那麼次線程將被掛起,知道目標線程t結束後才恢復;
- 理解:有A和B兩個線程,如果A線程在run()方法中,調用了B.join(),意思就A線程跑在路上的時候,把B線程的任務給加進來了,那麼就只能等着B跑完然後A接着跑。但是呢,如果想強制中斷也可以啊。直接掉B.interrupt()方法中斷掉B線程,但是記得try-catch; +