element table使用合計並且設定高度之後合計行不顯示問題 show-summary height衝突
技術標籤:JAVA小分類
Part——多執行緒
- 實現多執行緒
- 執行緒同步
- 生產者消費者
執行緒:是程序中的單個順序控制流,是一條執行路徑
單執行緒: 一個程序如果只有一條執行路徑 ,則稱為單執行緒程式
多執行緒: 一個程序如果有多條執行路徑,則稱為多執行緒程式
執行緒的生命週期
- 多執行緒的實現方式
方式一:繼承Thread類
- 定義一個類MyThread繼承Thread類
- 在MyThread類中重寫run()方法
- 建立MyThread類的物件
- 啟動執行緒
重寫run()方法用來封裝被執行緒執行的程式碼;
run():封裝執行緒執行的程式碼,直接呼叫,相當於普通方法的呼叫
start():啟動執行緒;然後由JVM呼叫此執行緒的run()方法
- 設定和獲取執行緒名稱
void setName(String name) | 將此執行緒的名稱更改為等於引數name |
String getName() | 返回此執行緒的名稱 |
public static Thread currentThread | 返回對當前正在執行的執行緒物件的引用 |
執行緒有兩種排程模型
分時排程模型:所有執行緒輪流使用CPU的使用權,平均分配每個執行緒佔用CPU的時間片
搶佔式排程模型:優先讓優先順序高的執行緒使用CPU,如果執行緒的優先順序相同,那麼會隨機選擇一個, 優先順序高的執行緒獲取的CPU時間片相對多一些
Java使用的是搶佔式排程模型
假如計算機只有一個CPU,那麼CPU在某-一個時刻只能執行 條指令, 執行緒只有得到CPU時間片,也就是使用權,
才可以執行指令。所以說多執行緒程式的執行是有隨機性,因為誰搶到CPU的使用權是不一定的
Thread類中設定和獲取執行緒優先順序的方法
public final int getPriority():返回此執行緒的優先順序
public final void setrPriority(int newPriority):更改此執行緒的優先順序
- 執行緒控制
static void sleep(long millis) | 使當前正在執行的執行緒停留 (暫停執行)指定的毫秒數 |
void join() | 此執行緒執行完畢後,其他執行緒才能執行 |
void setDaemon(boolean on) | 將此執行緒標記為守護執行緒, 當執行的執行緒都是守護執行緒時,Java虛擬機器將迅速退出 |
方式2:實現Runnable介面
- 定義一個類MyRunnable實現Runnable介面
- 在MyRunnable類中重寫run()方法
- 建立MyRunnable類的物件
MyRunnable my = new MyRunnable();
- 建立Thread類的物件,把MyRunnable物件作為構造方法的引數
Thread t = new Thread(my);
- 啟動執行緒
相比繼承Thread類,實現Runnable介面的好處
- 避免了Java單繼承的侷限性
- 適合多個相同程式的程式碼去處理同一個資源的情況,把執行緒和程式的程式碼、資料有效分離,較好的體現了面向物件的設計思想
- 執行緒同步
- 同步程式碼塊
pub1ic class SellTicket implements Runnable {
private int tickets = 100;
private 0bject obj = new Object();
@Override
public void run() {
while (true) {
//tickets = 100;
//t1, t2, t3
//假設t1搶到了CPU的執行權
//假設t2搶到了CPu的執行權
synchronized (obj){
//t1進來後,就會把這段程式碼給鎖起來
if (tickets > 0) {
try {
Thread.sleep(100);
//t1休息100毫秒
} catch(InterruptedException e) {
e.printStackTrace();
//視窗1正在出售第100張票
System.out.println(Thread.currentThread().getName()
+"正在出售第"+ tickets + "張票");
tickets--; //tickets = 99;
}
}
} //t1出來了,這段程式碼的鎖就被釋放了
}
}
- 同步方法
格式:修飾符+synchronized+返回值型別+方法名(方法引數){ }
同步方法的鎖物件是this
if(...){
synchronized(this){
...
}
}else{
public synchronized void sellTicket(){
...
}
}
同步靜態方法的鎖物件是 類名.class
if(...){
synchronized(SellTicket.class){
...
}
}else{
public static synchronized void sellTicket(){
...
}
}
- 執行緒安全的類
StringBuffer
- 執行緒安全,可變的字元序列
- 從版本JDK 5開始,被StringBuilder 替代。通常應該使用StringBuilder類, 因為它支援所有相同的操作,但它更快,因為它不執行同步
Vector
- 從Java 2平臺v1.2開始,該類改進了List介面, 使其成為Java Collections Framework的成員。 與新的集合實現不同,Vector被同步。 如果不需要執行緒安全的實現,建議使用ArrayList代替Vector
Hashtable
- 該類實現了一個雜湊表,它將鍵對映到值。 任何非null物件都可以用作鍵或者值
- 從Java 2平臺v1.2開始,該類進行了改進,實現了Map介面, 使其成為Java Collections Framework的成員。與新的集合實現不同,Hashtable被同步。 如果不需要執行緒安全的實現, 建議使用HashMap代替Hashtable
- Lock鎖
public class SellTicket implements Runnable {
private int tickets = 100;
private Lock lock = new ReentrantLock();
@Override
pub1ic void run(){
while (true){
try {
1ock.lock();
if(tickets > 0) {
try{
Thread.sleep(100);
}catch (InterruptedException e) {
e.printStackTrace();
System.out.println(Thread.currentThread().getName()
+"正在出售第"+ tickets +"張票");
tickets--;
} finally {
lock.unlock();
}
}
}
}
- 生產者消費者模式
void wait() | 導致當前執行緒等待,直到另一個執行緒呼叫該物件的notify()方法或notifyAll()方法 |
void notify() | 喚醒正在等待物件監視器的單個執行緒 |
void notifyAll() | 喚醒正在等待物件監視器的所有執行緒 |