java 多執行緒

yimgg發表於2020-11-29

Java多執行緒

建立多執行緒

通過以下兩種方法建立 Thread 物件:
方法一:宣告一個Thread類的子類,並覆蓋run()方法。

  class mythread extends Thread {
   	public void run( ) {
				/* 覆蓋該方法*/ 
			}
  	}

方法二:宣告一個實現Runnable介面的類,並實現run()方法。

class mythread implements Runnable{
public void run( ) {
			/* 實現該方法*/ 
		}
}

方法一定義的執行緒,要觸發一個新執行緒,使用 start()方法,如:

Mythread t = new Mythread();
t.start();

方法二要觸發一個新執行緒,先要封裝成一個Thread類的執行緒物件後,使用 start() 方法,如:

Mythread my = new Mythread();
Thread t=new Thread(my);
t.start();

在呼叫 start() 方法時,它將自動觸發 run() 方法,從而開啟子執行緒。run() 方法中的程式碼定義執行執行緒所需的功能。

注意

此方法比MyThread1中多一步,原因是MyThread1繼承了類Thread,而類Thread已經實現過介面Runnable。

總結

兩種方式雖然產生執行緒的步驟有區別,但從本質上來說,總體區別不大
只是如果一個類在定義為執行緒類的同時,還需要繼承另一個非執行緒的類,則此時要實現執行緒只能通過呼叫Runable介面的方式。

執行緒的生命週期

在這裡插入圖片描述

可能使執行緒暫停執行的條件:

執行緒優先順序比較低,因此它不能獲得 CPU 時間。
1.使用 sleep( ) 方法使執行緒睡眠,但不讓出cpu等資源的控制權,然後休眠結束後自動喚醒後執行。
2.通過呼叫 wait( ) 方法,使執行緒等待,直到取消等待後執行。 一般需與synchronized配合使用(執行緒被中斷)
3.通過呼叫 yield( ) 方法:
1)執行緒已顯式的方式出讓CPU控制權;
2)只將控制權交給同級或更高優先順序的其他執行緒
3)有很大的可能在其他執行緒執行完成後,為yield方法的呼叫執行緒再次奪回cpu繼續執行。

start()與run()方法區別:

start() : 它的作用是啟動一個新執行緒,新執行緒會執行相應的run()方法。start()不能被重複呼叫。
run() :直接呼叫run()方法就和普通的成員方法一樣,可以被重複呼叫,並不會啟動新執行緒會在當前執行緒(一般是主執行緒)中執行run()。

Thread類中的重要方法:

this.currentThread().getName()

返回當前執行緒的名稱

final boolean isAlive()

如果執行緒是啟用的,則返回 true

static void sleep( )

用於將執行緒掛起一段時間

static void yield() 

使正在執行的執行緒臨時暫停,並允許其他執行緒執行

final void join( ) throws  InterruptedException

一個執行緒可在其他執行緒上呼叫join()方法,則當前執行的執行緒將被掛起,直到目標執行緒執行結束它才恢復執行。也可以在呼叫join()方法時帶上一個超時引數,這樣若目標執行緒在指定時間到時還未結束的話,join()方法也總能返回。

void start( ) 

呼叫run( )方法啟動執行緒,開始執行緒的執行

static int activeCount( )

返回啟用的執行緒數

final int getPriority()

返回執行緒的優先順序

final void setPriority(int newp) 

修改執行緒的當前優先順序
注意:執行緒的優先順序分為1-10這10個等級,如果小於1或大於10,則丟擲異常throw new IllegalArgumentException(),預設是5。優先順序高的執行緒獲取CPU資源的概率較大,優先順序低的並非沒機會執行。

synchronized同步

有時兩個或多個執行緒可能會試圖同時訪問一個資源
在此情況下,資料可能會變得不一致。
為了確保在:
1)任何時間點
2)一個共享的資源
3)只被一個執行緒使用,使用了“同步”。

synchronized實現同步成功的幾種方式:
方式一:基本方式
執行緒繼承類Thread或介面Runnable實現,分別在方法和語句塊前實現同步鎖定。

public class Station extends Thread{}
public class COval extends Panel implements Runnable{}

方式二:類鎖定方式
分別在靜態方法、靜態語句塊、類物件前使用synchronized實現同步

public synchronized void test1(){}
public void test2() {
		synchronized(this){
				//程式碼
			}
		}

相關文章