1. 程式人生 > >圖解java多執行緒設計模式

圖解java多執行緒設計模式

序章1 Java執行緒

何謂執行緒

文中給出的解釋是:正在執行程式的主體

執行緒的啟動

新執行緒的啟動一定是呼叫start()方法,該方法主要是執行兩步操作

  1. 啟動新執行緒
  2. 呼叫新執行緒的run()方法

這裡需要注意:

public class Test()
{
	public static void main(String[] args)
	{
		Thread t = new Thread();
		t.start();
	}

}

public class Test()
{
	public static void main(String[] args)
	{
		Thread t = new Thread();
		t.run();
	}

}

的作用是不一樣的。呼叫start會開啟新執行緒,然後在新執行緒中呼叫run()方法;如果像第二段程式碼中那樣直接呼叫run(),那隻會在本執行緒中啟動run,不會有新執行緒產生。

概念

順序:用於表示多個操作依次執行。

並行:用於表示多個操作“同時進行”,並行的情況出現在多核cpu上,是說每個處理單元都在同時工作。

併發:這是某個處理單元在一個時間段上的概念。同一時間段內處理多個執行緒。並行可以在同一個脈衝中處理多個執行緒,但併發不行,併發強調的是通過執行緒切換,在一秒內可以同時處理多個執行緒。

建立執行緒

  1. 繼承Thread類
  2. 實現Runnable介面

執行緒的暫停

  1. Thread類的靜態方法sleep()
  2. Object類的wait()

對於Thread類的靜態方法sleep(),需要注意的是:

public class Test()
{
	public static void main(String[] args)
	{
		Thread t = new Thread();
		t.start();
		try
		{
			t.sleep(1000);
		}
		catch (InterruptedExpection e)
		{
			...
		}
	}

}

如果出現以上程式碼,那進入休眠的是主執行緒還是新執行緒?其實要知道sleep()是靜態方法,所以t.sleep()和Thread.sleep()的作用是一樣的,因此,進入休眠的是主執行緒。如果想要新執行緒進入休眠,就需要在新執行緒的run()方法上呼叫sleep()了。

一般靜態方法都需要通過例項物件來呼叫,而會直接通過類來呼叫,這樣會清晰,減少誤會。

靜態方法與例項方法的synchronized

synchronized靜態方法是使用該類的類物件鎖來執行執行緒的互斥處理的。

synchronized例項方法是使用this(例項物件)來執行執行緒的互斥處理的。

例如現在有個類Something,有兩個例項物件a, b,那a呼叫例項同步方法的時候b也可以呼叫b的同步方法。但是如果a呼叫同步靜態方法,那b就不能呼叫靜態同步方法了。原因在於Something的類物件只有一個!

讀後疑問:

  1. 克隆出來的例項物件是否為同一個物件?可以當做同一把鎖?(我覺得只要記憶體地址不一樣,就不是同一個鎖)
  2. notify只能喚醒一個執行緒,那到底喚醒哪個呢?(我覺得會喚醒等待佇列中最先進入的那個,可能是先進先出原則。)
  3. 如何理解“所有例項都擁有一個等待佇列”這句話?這個例項是指當前執行緒還是指鎖物件?