1. 程式人生 > >第35節:Java面向物件中的多執行緒

第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();
  1. 宣告一個 Thread 類的子類,覆蓋run()方法,建立子類物件,就是建立執行緒物件,然後呼叫start方法(開啟執行緒讓執行緒去執行,然後讓jvm呼叫run方法)。
  2. 宣告一個實現 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();
}

結語

  • 下面我將繼續對JavaAndroid中的其他知識 深入講解 ,有興趣可以繼續關注
  • 小禮物走一走 or 點贊