第35節:Java面向物件中的多執行緒
Java面向物件中的多執行緒
多執行緒
在Java
面向物件中的多執行緒中,要理解多執行緒的知識點,首先要掌握什麼是程序,什麼是執行緒?為什麼有多執行緒呢?多執行緒存在的意義有什麼什麼呢?執行緒的建立方式又有哪些?以及要理解多執行緒的特點等。
多執行緒和執行緒的理解
多執行緒?執行緒,多個執行緒,如何理解什麼是程序呢?
如圖:
工作管理員中有個程序,下面列表的則是正在進行中的任務程式,都屬於程序(正在執行中的程式),那麼具體的程序是什麼?程序實質是:應用程式在記憶體中執行的所佔空間。
可以理解為一個空間,當一個應用程式啟動時,就為一個程序,如qq
的啟動,可以為一個程序,(簡單理解正在進行的應用程式),那麼我們在玩qq
多執行緒,你在玩qq
的時候,是不是同時和其他人聊天呢?即為多執行緒嘛,可以這麼理解。多執行緒同時處理問題,和執行任務。
一個程序中至少有一個執行緒
一個應用程式啟動了多執行緒,可以實現多個任務同時執行,這也就是Java中的併發概念。
多執行緒的原理
多執行緒是如何使用的呢?多執行緒的使用可以合理的安排cpu
的呼叫,多執行緒會導致程式的效能降低,多執行緒是靠cpu
內部處理快速切換完成的。
案例
主方法的執行,主執行緒執行負責,start
class Demo{
private String name;
Demo(String name){
this.name = name;
}
public void show(){
for(int i = 0; i < 10; i++){
System.out.println("name"+name+"執行到第"+i);
}
}
}
// 測試
class ThreadDemo{
public static void main(String[] args){
Demo demo1 = new Demo("dashu");
Demo demo2 = new Demo("dashu2");
demo1.show();
demo2.show();
}
}
// 主執行緒,先執行demo1.show()完成後再次執行demo2.show()
多執行緒的優點
- 多執行緒程式設計比較簡單,效率也高,可以共享資料和資源
- 適合開發服務的程式,如聊天等
- 適合開發有多種互動的介面程式等
執行緒類(Thread)及其方法
多執行緒中的一些概念,程式指用靜態的計算機語言編寫的程式碼程式,多程序指在作業系統中有多個程式同時執行,那麼多執行緒是指在程式中有多個執行緒同時執行咯~
再次強調:一個程序中至少要有一個執行緒,一個程序可以有多個執行緒
執行緒的建立:
java.lang.Object->java.lang.Thread
public class Thread extends Object implements Runnablef
執行緒物件呼叫run
方法是不開啟執行緒的,由物件呼叫方法,是main
主執行緒負責的,呼叫start
開啟執行緒,並讓jvm
呼叫run
方法在開啟的執行緒中執行,即開啟執行緒,多一條路可以走。注意有主執行緒負責的為一條執行緒路,run
方法啟動的。
// 為一條主執行緒,先執行d1,然後為d2
d1.run();
d2.run();
// 為兩條執行緒,d2和d1不併發,run()走完,才開啟start()
d1.run();
d2.start();
// 為三條執行緒
d1.start();
d2.start();
// 為兩條執行緒,d2和d1併發
d2.start();
d1.run();
- 宣告一個
Thread
類的子類,覆蓋run()
方法,建立子類物件,就是建立執行緒物件,然後呼叫start
方法(開啟執行緒讓執行緒去執行,然後讓jvm
呼叫run
方法)。 - 宣告一個實現
Runnable
介面的類,實現run()
方法。
// 宣告一個 Thread 類的子類,覆蓋run()方法
class Mythread extends Thread {
// 覆蓋run方法
public void run( ){
...
}
}
繼承Thread
類,是因為Thread
類中有描述執行緒的事務,具備執行緒該有的功能,建立執行緒是為了建立獨立的執行路徑,實現程式碼同時執行,執行緒的建立就是為了給執行緒執行任務。
Runnable
介面,public interface Runnable
Demo d = new Demo("dashucoding");
Thread t1 = new Thread(d);
t1.start();
定義類實現Runnable
介面,覆蓋run
方法,執行緒任務程式碼在run
中定義,建立Runnable
介面的子類物件,建立執行緒物件,並將Runnable
介面的子類物件作為引數傳遞給Thread
的建構函式,start
呼叫開啟執行緒即可。
// 宣告一個實現 Runnable 介面的類,實現run()方法
class Mythread implements Runnable {
// 實現run方法
public void run( ){
...
}
}
主執行緒是執行在main
函式中的,自定義的執行緒是要將需要執行的任務定義在run
方法中,在Thread
類中的run
方法不是我們需要執行的,所以我們需要自己重寫這個方法,將要執行的任務diam
定義在run
方法中即可。
建立新的執行執行緒在
Java
中有兩種方法,一種為將類宣告為Thread
的子類,將該子類重寫Thread
類的run
方法,接著分配和啟動該子類的例項;另外一種方法是宣告實現Runnable
介面的類,然後實現run
方法。
執行緒類的主要方法
執行緒巢狀類摘要:
// 執行緒的狀態
Thread.State
// 當執行緒因未捕獲的異常而突然終止時,呼叫的處理程式的介面
Thread.UncaughtExceptionHandler
一般方法:
// 構造方法
Thread()
// 給執行緒指定一個名字
Thread(String threadName)
// 執行緒所執行的程式碼
void run()
// 執行緒睡眠
void sleep()
// 改變執行緒的名字
void setName(String threadName)
// 獲得執行緒的名字
String getName()
方法 | 說明 |
---|---|
currentThread() |
返回對當前正在執行的執行緒物件的引用 |
getId() |
返回該執行緒的識別符號 |
getName() |
返回該執行緒的名稱 |
getPriority() |
返回該執行緒的優先順序 |
執行緒的生命週期
執行緒是程式內部的一個控制流,它是由特定的生命週期的,執行緒的狀態表示了執行緒正在進行任務。
建立新的執行緒,執行緒建立後,進入到就緒狀態,等待start()
方法被呼叫,然後進入到執行狀態,線上程中可以設定等待一個事件,該執行緒就會處於阻塞狀態,直到run()
方法結束,或呼叫stop()
方法後,執行緒就處於死亡狀態。
執行緒休眠
myThread.sleep(10000);
執行緒死亡
myThread.stop( );
多執行緒的執行,在棧記憶體中,每一個執行緒都有屬於自己的棧記憶體空間,進行壓棧和彈棧,當執行緒結束時,該執行緒就會在棧記憶體中釋放。
執行緒的優先順序
執行緒中是具有優先順序的,Java
提供了執行緒排程器來監控所有執行緒,通過執行緒排程器安排哪個執行緒進行執行,優先順序高的執行緒會在優先順序低的執行緒之前先進行執行,優先順序的分類:低(Thread.MIN_PRIORITY
),中(Thread. NORM_PRIORITY
),高(Thread.MAX_PRIORITY
)。
執行緒優先順序的一些方法
// 獲得執行緒的優先順序
int getPriority()
// 改變執行緒的優先順序
void setPriority( int p )
執行緒是程式在執行中的執行單元,
Java
虛擬機器時允許應用程式同時併發多個執行緒的,每個執行緒獨有屬於自己的優先順序,處於高優先順序的執行緒是先於低優先順序的執行緒進行執行。
多執行緒的案例
class Ticket implements Runnable{
private int tickets = 100;
public void run(){
...
}
}
class Demo{
Ticket t = new Ticket();
Thread t1 = new Thread(t);
t1.start();
}
結語
- 下面我將繼續對
Java
、Android
中的其他知識 深入講解 ,有興趣可以繼續關注 - 小禮物走一走 or 點贊