1. 程式人生 > >多執行緒學習(1)

多執行緒學習(1)

優點:多程序,多執行緒可以讓程式不被阻塞.可以充分利用多核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();
}
}