1. 程式人生 > 其它 >element table使用合計並且設定高度之後合計行不顯示問題 show-summary height衝突

element table使用合計並且設定高度之後合計行不顯示問題 show-summary height衝突

技術標籤:JAVA小分類

Part——多執行緒

  1. 實現多執行緒
  2. 執行緒同步
  3. 生產者消費者

執行緒:是程序中的單個順序控制流,是一條執行路徑
單執行緒: 一個程序如果只有一條執行路徑 ,則稱為單執行緒程式
多執行緒: 一個程序如果有多條執行路徑,則稱為多執行緒程式

執行緒的生命週期

  • 多執行緒的實現方式

方式一:繼承Thread類

  • 定義一個類MyThread繼承Thread類
  • 在MyThread類中重寫run()方法
  • 建立MyThread類的物件
  • 啟動執行緒

重寫run()方法用來封裝被執行緒執行的程式碼;

run():封裝執行緒執行的程式碼,直接呼叫,相當於普通方法的呼叫
start():啟動執行緒;然後由JVM呼叫此執行緒的run()方法

  • 設定和獲取執行緒名稱
Thread類中設定和獲取執行緒名稱的方法
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();
            }
        }
    }
}
  • 生產者消費者模式
Object類的等待和喚醒方法
void wait()導致當前執行緒等待,直到另一個執行緒呼叫該物件的notify()方法或notifyAll()方法
void notify()喚醒正在等待物件監視器的單個執行緒
void notifyAll()喚醒正在等待物件監視器的所有執行緒

送牛奶案例