圖解java多執行緒設計模式
阿新 • • 發佈:2018-12-16
序章1 Java執行緒
何謂執行緒
文中給出的解釋是:正在執行程式的主體
執行緒的啟動
新執行緒的啟動一定是呼叫start()方法,該方法主要是執行兩步操作
- 啟動新執行緒
- 呼叫新執行緒的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上,是說每個處理單元都在同時工作。
併發:這是某個處理單元在一個時間段上的概念。同一時間段內處理多個執行緒。並行可以在同一個脈衝中處理多個執行緒,但併發不行,併發強調的是通過執行緒切換,在一秒內可以同時處理多個執行緒。
建立執行緒
- 繼承Thread類
- 實現Runnable介面
執行緒的暫停
- Thread類的靜態方法sleep()
- 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的類物件只有一個!
讀後疑問:
- 克隆出來的例項物件是否為同一個物件?可以當做同一把鎖?(我覺得只要記憶體地址不一樣,就不是同一個鎖)
- notify只能喚醒一個執行緒,那到底喚醒哪個呢?(我覺得會喚醒等待佇列中最先進入的那個,可能是先進先出原則。)
- 如何理解“所有例項都擁有一個等待佇列”這句話?這個例項是指當前執行緒還是指鎖物件?