1. 程式人生 > >黑馬程式設計師—執行緒概述

黑馬程式設計師—執行緒概述

程序:
正在執行的程式,是系統進行資源分配和呼叫的獨立單位。
每一個程序都有它自己的記憶體空間和系統資源。
執行緒:
是程序中的單個順序控制流,是一條執行路徑
一個程序如果只有一條執行路徑,則稱為單執行緒程式。
一個程序如果有多條執行路徑,則稱為多執行緒程式

單程序單執行緒: 一個獨木橋,同時只能有一個人過;多個人的時候排隊,依次通過
單程序多執行緒:一座大橋, 同時可以有多輛汽車行駛
多程序多執行緒:多座大橋,每座橋上,都可以同時可以有多輛汽車行駛
如何建立一個執行緒呢?
想建立執行緒,那麼要先有程序,而程序我們建立不了,由系統來建立,我們在程序的基礎上,建立執行緒 ( Thread )

Thread類:
是程式中的執行執行緒。Java 虛擬機器允許應用程式併發地執行多個執行執行緒。

建立執行緒的幾種方式?(重點)
建立新執行執行緒有兩種方法
方式1:
繼承Thread執行緒類
1,建立一個類為 Thread類的子類
2,該子類應重寫 Thread 類的 run 方法
3,建立子類物件
4,呼叫start()方法,啟動執行緒

方式2;
建立一個實現 Runnable 介面的類
1,建立自定義類實現 Runnable介面
2,在自定義類重寫run()方法
3,建立自定義類物件
4,建立執行緒物件,並把自定義類物件,作為構造方法引數使用
5,呼叫start()方法,啟動執行緒

面試題:執行緒的生命週期

面試題:
問:啟動執行緒 使用的是start()方法 還是 run()方法??
啟動執行緒 使用的是start()方法

public void start()
使該執行緒開始執行;Java 虛擬機器呼叫該執行緒的 run 方法。
public void run()
指定每一個執行緒啟動後,要執行的操作

Thread類方法介紹———-執行緒類
建立執行緒的基本方法————— User u=new User();—-User類實現了Runnable介面的
Thread t=new Thread(u);
* 構造方法:
* public Thread(String name)分配新的 Thread 物件———-給物件起名字
* 方法:
* public final String getName()返回該執行緒的名稱。
* 預設的執行緒名稱為: Thread-編號, 編號從0開始
* public final void setName(String name)
* 改變執行緒名稱,使之與引數 name 相同

public static Thread currentThread()
返回對當前正在執行的執行緒物件的引用。
返回:當前執行的執行緒
public final int getPriority()返回執行緒的優先順序。
public final void setPriority(int newPriority)更改執行緒的優先順序
IllegalArgumentException - 如果優先順序不在 MIN_PRIORITY 到 MAX_PRIORITY 範圍內。
IllegalArgumentException 丟擲的異常表明向方法傳遞了一個不合法或不正確的引數

public static final int MAX_PRIORITY 10 最大優先順序
public static final int MIN_PRIORITY 1 最小優先順序
public static final int NORM_PRIORITY 5 預設優先順序

public static void sleep(long millis)
throws InterruptedException在指定的毫秒數內讓當前正在執行的執行緒休眠(暫停執行),

public void run() :
如果該執行緒是使用獨立的 Runnable 執行物件構造的,則呼叫該 Runnable 物件的 run 方法;否則,該方法不執行任何 操作並返回。
Thread 的子類應該重寫該方法。

public void run() {------------------將此方法重寫     如:   public void run() {
          if (target != null) {                                                        for (int i = 1; i <= 100; i++) {
              target.run();                                                                 System.out.println(getName() +"=="+ i);
          }                                                                                                    }
      }

綜合案例1:
多個售票員一起賣電影票案例
*
* 票 class Ticket
* 售票員 (執行緒)
*
* ————————
* 發現模擬真實賣票出現的問題
* 1,重複的票
* 2,負數的票
*
* ———————–
* 解決上述的問題
* 通過執行緒的同步機制來解決問題
* 執行緒的同步機制 就是 保證執行緒安全
*
* 執行緒安全 – 執行緒同步 – Vector
* 執行緒不安全 – 執行緒不同步 – ArrryList
*
* ————————–
* 同步機制的實現方式:
* 1, 同步程式碼塊
* 格式:
* synchronized(鎖物件) {
* 可能出現執行緒不同步問題的程式碼
* }
* 這裡的鎖物件,可以是任何建立的物件
*
* 2, 同步方法
* 普通同步方法
*
* 靜態同步方法
*
*/
程式碼例項

public class TicketThread {
public static void main(String[] args) {
//票
Ticket ticket = new Ticket();

//建立3個售票員
Thread t1 = new Thread(ticket, "售票員1號");
Thread t2 = new Thread(ticket, "售票員2號");
Thread t3 = new Thread(ticket, "售票員3號");
//啟動執行緒
t1.start();
t2.start();
t3.start();
}
}
public class Ticket implements Runnable {


private int ticket = 100;// 剩餘票數
private Object lock = new Object();// 任何的物件都可以作為鎖


@Override
public void run() {
while (true) {
// t1,t2,t3
method();
}
}
// 同步方法
private synchronized void method() {
// synchronized( lock ){// synchronized 執行緒同步,鎖
if (ticket > 0) {// 有票就賣票 ticket = 1;
// 模擬選座位
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
// t1,t2,t3
System.out.println(Thread.currentThread().getName() + "--正在賣 "
+ ticket);// 1,0,-1
ticket--;// 剩餘票數0,-1,-2
}
// }


}
}