JAVA——多線程之基礎知識

多線程:

多線程指的是在單個程序中可以同時運行多個同的線程執行不同的任務。可以提前學習操作系統中的相關知識。
Java中如果我們自己沒有產生線程,那麼系統就會給我們產生一個線程(主線程,main方法就在主線程上運行),我們的程序都是由線程來執行的。

一、線程與進程:

一個應用程序就是一個進程,一個進程有多個線程;
進程獨享資源,線程間共享所屬進程的資源
線程隨着進程的結束而消失
進程間通信非常複雜,線程之間通信簡單
多進程的意義:提高CPU的使用率
多線程的意義:提高應用程序的使用率
1)Java程序運行原理
由java命令啓動JVM,JVM啓動就相當於啓動了一個進程,該進程創建了一個主線程去調用main方法。
2)jvm虛擬機的啓動時單線程還是多線程?
JVM的啓動是多線程的,因爲它最低有兩個線程啓動了,主線程和垃圾回收線程
二、java線程的處理方式
         (一)(實現多線程的方式)都可以使用外部類或匿名內部類在同一個java文件中實現
1、extends Thread:繼承線程類,重寫run()方法,創建MyThread類對象,啓動線程start()
2、implements Runnable: MyThread實現Runnable接口,重寫run()方法,創建MyThread類對象,創建Thread類隊形,並把MyThread對象作爲構造參數傳遞
          爲什麼繼承接口的方法比較好?
1、可以避免由於Java單繼承帶來的侷限性;
2、適合多個相同程序的代碼取處理同一個資源的情況,把線程同程序的代碼,數據有效分離,較好的體現了面向對象的設計思想(耦合性若,數據分離);
舉例:
繼承Thread:MyThread t1=new MyThread();  MyThread t2=new MyThread();  t1.start();t2.start();
實現Runnable:MyRunnable m=new Runnable(); Thread t=new Thread(m);
Thread t2=new Thread(m); t1.start();t2.start();
           (二)中斷線程 Thread t=new MyThread();
1、t.stop();  //具有不安全性,不建議使用---讓線程停止,全部停止
2、t.interrupt();//終止線程後,拋出InterruptException,然後繼續執行後續代碼
補充:
1、繼承Thread要重寫run()方法,爲什麼呢?
  不是類中的所有代碼都需要被線程執行的。java提供了Thread類中run()用來包含那些被線程執行的代碼。
2、run():直接調用僅僅是普通方法
start():先啓動線程,再有JVM調用run()方法
三、線程
1、分類
1)精靈線程:又稱後臺線程,守護線程;當其他線程都結束後,精靈線程也跟着結束;如果運行的都是守護線程,則虛擬機直接退出, 該方法必須在啓動線程前調用。 怎麼標記爲守護線程呢啓動前:t.setDaemon(true);
2)主線程:main方法
3)子線程:除main方法外的線程
2、屬性
當前執行的線程對象:Thread.currentThread
名字:getName()
id:
線程優先級:getPriority()
線程組:ThreadGroup:
3、線程的調度和優先級問題
A:線程的調度
a:分時調度
b:搶佔式調度 (Java採用的是該調度方式)優先級高的先運行,相同則隨機
B:獲取和設置線程優先級
a:默認是5
b:範圍是1-10
四、線程生命週期
1、狀態
新建:創建程序對象
就緒:有執行資格,沒有執行權
運行:有執行資格,有執行權
阻塞:由於一些操作讓線程阻塞,沒有執行資格,沒有執行權
另一些操作讓它激活後,處於就緒狀態
死亡:線程對象變成垃圾,等待回收
2、畫圖


五、如何控制線程運行
1、sleep:睡眠
2、join:在一個線程中調用另一個線程的join 則當前的線程阻塞,另一個線程先執行,執行完後才執行當前進程——相當於——單進程
3、yield:
sleep與yield:
1)相同:
Thread類的靜態方法,都會使當前的線程放棄CPU,
2)差別:yield讓出後是就緒狀態也有可能會執行
yield只會把CPU讓給相同或更高優先級的線程;直接轉入就緒狀態,不會拋出異常
sleep就是讓出去; sleep後轉入阻塞再就緒,會拋出異常
4、synchronized
synchronized(對象){需要同步的代碼;}
同步可以解決安全問題的根本原因就在那個對象上。該對象如同鎖的功能。要求:多個線程必須是使用同一個對象鎖
同步的好處:同步的出現解決了多線程的安全問題。

同步的弊端:當線程相當多時,因爲每個線程都會去判斷同步上的鎖,這是很耗費資源的,無形中會降低程序的運行效率。
5、優先級:setProperty(" "); 1-10 優先級越大,執行的機率越大;
七、死鎖---果出現了同步嵌套,就容易產生死鎖問題
1、什麼是死鎖
指兩個或以上的進程在執行過程中,由於競爭資源或者由於批次通信而造成的而一種阻塞的現象,//若干個資源循環等待資源而造成阻塞的情況(是指兩個或者兩個以上的線程在執行的過程中,因爭奪資源產生的一種互相等待現象)
2、死鎖的四個條件
互斥:一個資源只能被一個進程使用
循環等待:若干進程間頭尾相接的循環等待資源關係
不剝奪條件:進程資源在未使用完之前,不會強行被剝奪
請求與保持:因請求資源而阻塞時,也不會放棄已有的資源
八、線程間通信---針對同一個資源的操作有不同種類的線程
--生產者與消費者----解決死鎖
九、線程組
Java中使用ThreadGroup來表示線程組,它可以對一批線程進行分類管理,Java允許程序直接對線程組進行控制。默認情況下,所有的線程都屬於主線程組。
public final ThreadGroup getThreadGroup() 我們也可以給線程設置分組Thread(ThreadGroup group, Runnable target, String name) 十、線程池
程序啓動一個新線程成本是比較高的,因爲它涉及到要與操作系統進行交互。而使用線程池可以很好的提高性能,尤其是當程序中要創建大量生存期很短的線程時,更應該考慮使用線程池。
線程池裏的每一個線程代碼結束後,並不會死亡,而是再次回到線程池中成爲空閒狀態,等待下一個對象來使用。
在JDK5之前,我們必須手動實現自己的線程池,從JDK5開始,Java內置支持線程池
發佈了16 篇原創文章 · 獲贊 32 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章