1、例子:用兩個執行緒,交替列印1-100的數字
public class main
}class number implements runnableelse
try catch (interruptedexception e) }}
}}
涉及到的三個方法:wait():一旦執行到此處,當前執行緒就進入阻塞狀態,並且釋放同步監視器。
notify():一旦執行到此處,就會喚醒被wait的乙個執行緒,如果有多個,釋放優先順序高的。
notifyall():一旦執行到此處,就會喚醒被wait的所有執行緒
注意:
這個三個方法必須要使用在同步方法或者同步**塊中。
這個三個方法的呼叫者,是同步監視器。
這個三個方法是定義在object中的,因為同步監視器可以是任何乙個類的物件。
2、sleep()和wait()的異同
相同:一旦執行方法當前執行緒就會被阻塞
不同:兩個方法宣告的位置不同:thread類中宣告sleep,object類中宣告wait
呼叫的要求不同:sleep可以在任何需要的條件下呼叫,wait必須要使用在同步方法或者同步**塊中
是否釋放同步監視器:如果都在同步方法或者同步**塊中,wait會釋放鎖,sleep不會
3、執行緒通訊的應用:生產者/消費者問題
生產者(productor)將產品交給店員(clerk),而消費者(customer)從店員處,取走產品,店員一次只能持有固定數量的產品,如果生產者試圖生產更多的產品,店員會叫停。如果店員沒用足夠的產品,會讓消費者等一下。
class clerkelse catch (interruptedexception e) }}
//消費產品
public synchronized void consumeproduct() else catch (interruptedexception e) }}
}class productor extends thread
@override
public void run()
}}class customer extends thread
@override
public void run()
}}public class main
}
1、實現callable介面與runnable相比,更強大。
相比run()方法有可以有返回值。
可以丟擲異常,
支援泛型的返回值
需要借助futuretask類(future介面可以對runnable、callable任務執行的結果進行取消、查詢是否完成、獲取結果等。futuretask是future介面的唯一實現類,futuretask同時實現了runnable、future介面。)
//建立乙個callable介面的實現類
class numthread implements callable
}return sum;
}}public class main catch (interruptedexception e) catch (executionexception e) }}
2、使用執行緒池背景:經常建立和銷毀、使用量特別大的資源,比如併發情況下的執行緒,對效能影響很大。
思路:提前建立好多個執行緒,放入執行緒池中,使用直接獲取,使用完放回池中。類似生活中的交通工具
}快取執行緒池:(長度無限制)1、判斷執行緒池是否存在空閒的執行緒
2、存在則使用
4、不存在,則建立執行緒,放入執行緒池中,然後使用
public class main
});service.execute(new runnable()
});service.execute(new runnable()
});//這時緩衝池有是三個執行緒
thread.sleep(1000);
//會使用上面三個執行緒池中的乙個來執行任務
service.execute(new runnable()
});}}
定長線程池:(長度是指定的)1、判斷執行緒池是否存在空閒的執行緒
2、存在則使用
4、不存在,且執行緒池未滿的情況下,建立,否則就會等待。
public class main catch (interruptedexception e)
}});
service.execute(new runnable() catch (interruptedexception e)
}});
//過了三秒才會執行
service.execute(new runnable()
});}}
單執行緒執行緒池:1、判斷執行緒池是否存在空閒的執行緒
2、存在則使用
4、不存在則等待,等那個單執行緒空閒後使用
public class main
});service.execute(new runnable()
});service.execute(new runnable()
});}}
週期任務 定長線程池:在定長線程池的基礎上,定時執行,當某個時機觸發時,自動執行某任務
public class main
}, 3, timeunit.seconds);
/*** 週期執行任務
* 引數1:任務
* 引數2:延遲時長數字(第一次執行在什麼時間以後)
* 引數2:週期時長數字(每隔多久執行)
* 引數3:時長數字的時間單位
*/service.scheduleatfixedrate(new runnable()
}, 3, 1, timeunit.seconds);
}}
多執行緒 執行緒安全
原因 當多個執行緒同時共享,同乙個全域性變數或靜態變數。做寫的操作時,可能發生資料衝突問題,也就是執行緒安全問題。但是做讀操作是不會發生資料衝突問題。解決方案 方式一 內建鎖synchronized synchronized保證執行緒原子性,當執行緒進入方法的時候,自動獲取鎖,一旦鎖被其它執行緒獲取...
多執行緒 執行緒安全
public class unsafethread t.start while thread.activecount 1 system.out.println sum 1 從主記憶體中講sum變數複製到執行緒的工作記憶體 2 在工作記憶體中修改變數 1操作 3 將sum變數從執行緒的工作記憶體寫回到...
多執行緒 執行緒安全
執行緒安全 多個執行流對臨界資源的爭搶訪問,但是不會出現資料二義性 執行緒安全的實現 同步 通過條件判斷保證對臨界資源訪問的合理性 互斥 通過同一時間對臨界資源訪問的唯一性實現臨界資源訪問的安全性 互斥鎖實現的原理 互斥鎖本身是乙個只有0 1的計數器,描述了乙個臨界資源當前的訪問狀態,所有執行流在訪...