多執行緒學習(1)
阿新 • • 發佈:2018-11-03
優點:多程序,多執行緒可以讓程式不被阻塞.可以充分利用多核cpu的優勢,提高執行效率
建立方式:
(1)通過繼承Thread類,並重寫其中的run方法來出建立
Thread t = new Thread() {
public void run() { // 執行
// 執行緒需要執行的程式碼
// 不能丟擲檢查異常,只能自己處理檢查異常
}
};
(2)通過重寫runnable中的run方法來建立
Runnable runnable = new Runnable() { public void run(){ // 要執行的程式碼 } }; Thread t = new Thread( runnable ); t.start
執行緒中常見的問題(互鎖)的提出與解決方案:
互鎖
Object A = new Object(); Object B = new Object(); Thread a = new Thread(()->{ synchronized (A) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (B) { System.out.println("操作..."); } } }); Thread b = new Thread(()->{ synchronized (B) { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (A) { System.out.println("操作..."); } } }); a.start(); b.start();
檢測死鎖可以使用 jconsole工具
死鎖問題可以通過Wait方法與notefy方法結合解決:
public class Test12 { static Object obj = new Object(); static boolean t2runed = false;// t2是否執行過 // 列印 2, 1 public static void main(String[] args) { Thread t1 = new Thread(() -> { synchronized (obj) { while(!t2runed) { // 如果t2沒有執行過 try { obj.wait(); // 執行緒t1 先等一會 } catch (InterruptedException e) { e.printStackTrace(); } } } System.out.println(1); }); Thread t2 = new Thread(()->{ System.out.println(2); synchronized (obj) { t2runed = true; obj.notify(); } }); t1.start(); t2.start(); } }