多線程基本概念_程序_進程_線程

程序(Program):是一個靜態的概念,是一個指令的集合。

進程Process:(正在執行中的程序)是一個靜態的概念進程是程序的一次靜態態執行過程, 佔用特定的地址空間.每個進程都是獨立的,由 3 部分組成 cpu,data,code。

線程:是進程中一個「單一的連續控制流程」 (a singlesThread,equential flow of control)/執行路徑。線程又被稱為輕量級進程(lightweight process)。

(1) 進程與線程之間區別?

根本區別:

  • 進程 :是作為資源分配的單位。
  • 線程:是調度和執行的單位。

開銷 :

  • 進程間的切換會有較大的開銷。
  • 線程每個線程有獨立的運行棧和程序計數器(PC),線程切換的開銷小。

所處環境:

  • 在操作系統中能同時運行多個任務(程序)。
  • 線程在同一應用程序中有多個順序流同時執行。

分配內存:

  • 系統在運行的時候會為每個進程分配不同的內存區域。
  • 線程 除了 CPU 之外,不會為線程分配內存(線程所使用的資源是它所屬的進程的資源), 線程組只能共享資源。

實現多線程的方法:

1. 通過繼承Thread類實現多線程

  1. 繼承Thread類
  2. 重寫run()方法
  3. 通過start()方啟動線程

Java 中的類是單繼承的,一旦繼承了 Thread 類,就不允許再去繼承其它的類

2.通過實現介面Runnable實現多線程

  1. 編寫類實現 Runnable 介面
  2. 實現 run()方法
  3. 通過 Thread 類的 start()方法啟動線程

線程狀態、線程的生命週期

  • 新生狀態:

用 new 關鍵字建立一個線程後,該線程對象就處於新生狀態。處於新生狀態的線程有 自己的內存空間,通過調用start()方法進入就緒狀態。

  • 就緒狀態

處於就緒狀態線程具備了運行條件,但還沒分配到 CPU,處於線程就緒隊列,等待系統為其分配 CPU。當系統選定一個等待執行的線程後,它就會從就緒狀態進入執行狀態,該動作稱為「CPU 調度。

  • 運行狀態

在運行狀態的線程執行自己的 run 方法中代碼,直到等待某資源而阻塞或完成任何而死亡。如果在給定的時間片內沒有執行結束,就會被系統給換下來回到等待執行狀態。

  • 阻塞狀態

處於運行狀態的線程在某些情況下,如執行了 sleep(睡眠)方法,或等待 I/O 設備等資源,將讓出 CPU 並暫時停止自己運行,進入阻塞狀態。在阻塞狀態的線程不能進入就緒隊列。只有當引起阻塞的原因消除時,如睡眠時間已到,或等待的I/O 設備空閑下來,線程便轉入就緒狀態,重新到就緒隊列中排隊等待,被系統選中後從原來停止的位置開始繼續執行。

  • 死亡狀態

死亡狀態是線程生命週期中的最後一個階段。線程死亡的原因有三個,一個是正常運行的線程完成了它的全部工作;另一個是線程被強制性地終止,如通過 stop 方法來終止一個線程【不推薦使用】;三是線程拋出未捕獲的異常。

獲取線程基本信息的方法

  • currentThread() 返回目前正在執行的線程,獲取線程信息
  • getName() 返回線程的名稱
  • setName() 設置線程的名稱
  • isAlive() 判斷線程是否處於活動狀態

public class TestGetName {
public static void main(String[] args) {
//主線程的名稱
Thread t=Thread.currentThread();
String name=t.getName();
System.out.println("主線程的名稱:"+name);

//創建MyRunnable類的對象
MyRunnable my=new MyRunnable();
Thread t1=new Thread(my,"自定義的線程1");
Thread t2=new Thread(my,"線程2");
Thread t3=new Thread(my,"線程3");
System.out.println("修改之前:"+t3.getName());
//修改線程的名稱
t3.setName("自定義的線程------------3");
System.out.println("修改之後:"+t3.getName());

//啟動線程
t1.start();
t2.start();
t3.start();
}
}

----------------------

public class TestIsAlive {
public static void main(String[] args) {
//主線程
MyThread my=new MyThread();
System.out.println("線程my處於新生狀態的是否處於活動狀態:"+my.isAlive());
my.start();//啟動線程
System.out.println("線程my處於就緒狀態的線程是否處於活動狀態:"+my.isAlive());
//主線程中的循環
for(int i=0;i<10;i++){
System.out.println("----------"+Thread.currentThread().getName()+"--------->"+i);
}
//主線程中的最後一句代碼
System.out.println("my線程是否處於活動狀態:"+my.isAlive());
}
}
class MyThread extends Thread{
@Override
public void run() {
for(int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName()+"---------->"+i);
}
}
}

-----------------------

public class TestThreadMethod {
//主方法,主線程
public static void main(String[] args) {
Thread t=Thread.currentThread();
//toString()方法得到的內容 為 [線程名稱,線程的優先順序,線程組的名稱]
System.out.println(t.toString());

//線程線程類的對象
MyRunnable my=new MyRunnable();
Thread t1=new Thread(my);
Thread t2=new Thread(my);
Thread t3=new Thread(my);

//啟動線程
t1.start();
t2.start();
t3.start();
/**在Thread類中一定有一個靜態變數int,用於統計創建線程的個數 */
//線程的默認的命名規則 Thread - int類型的變數的值
}
}
class MyRunnable implements Runnable{

@Override
public void run() {
Thread t=Thread.currentThread();
System.out.println("線程的名稱"+t.getName());
}

}

1. 暫停線程執行sleep_yield_join_stop

暫停線程執行的方法有哪些?

  1. final void join() 調用該方法的線程強制執行,其它線程處於阻塞狀態,該線程執行完畢後,其它線程再執行。
  2. Thread.sleep(long millis) 使用當前正在執行的線程休眠 millis 秒,線程處於阻塞狀態。
  3. Thread.yield() 當前正在執行的線程暫 停一次,允許其他線程執行,不阻塞,線程進入就緒狀態,如果沒有其他等待執行的線程,這個時候當前線程就會馬上恢復執行。
  4. Stop()強迫線程停止執行。已過時。不推薦使用.

sleep,yield,join方法將會導致線程進入什麼狀態?

  • Join 處於運行狀態
  • Sleep 處於線程處於阻塞狀態
  • yield線程進入就緒狀態

線程的優先順序問題

設置和獲取線程的優先順序的方法分別是什麼?

  1. getPriority() 獲取線程的優先順序
  2. setPriority(intpriority)設置線程的優先順序
  3. Thread.MAX_PRIORITY設置最高優先順序
  4. Thread.MIN_PRIORITY設置最低優先順序
  5. Thread.MORM_PRIORITY默認優先順序

線程同步_具體實現

1 同步實現的方式 同步代碼塊

synchronized(obj){ //中的 obj 稱為同步監視器

}

2 同步方法 同步方法的同步監視器為當前對象 this

public synchronized …方法名(參數列表){

}

線程間通信的方法有哪些?

wait():調用了 wait()方法的線程進入等待池進行等待,等待池中的線程不去競爭對象鎖,直到其它的線程通知,才會進入鎖池。

notify():隨機喚醒一個在該對象上等待的線程,被喚醒的線程進行鎖池,開始競爭該對鎖上的鎖。

notifyAll():喚醒所有在該對象上等待的線程優先順序高的線程有可能先競爭到對象鎖只能在同步方法和同步代碼塊中使用。


推薦閱讀:
相關文章