多線程

簡單講解了關于多線程的一些應用:線程進程的概念區別,定義多線程,多線程之間的通信,線程的死鎖,以及線程的優先級。此類問題在Java面試當中經常觸及。


多線程.png

1.多線程的實踐:

package Thread;
public class Live implements Runnable{
    public void run() {
        for(int i = 1;i<=6;i++){
            System.out.println("摳腳"+i+"次");
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

package Thread;
public class Play extends Thread{
    public void run(){
        for(int i=1;i<=30;i++){
            System.out.println("who打單機:第"+i+"局,輸了,玩的真菜!");
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

package Thread;
/*
 * 多線程同時執行,有兩種實現多線程的方法,一種是繼承類,一種是實現接口。
 * 繼承: 繼承Thread的話,該子類應重寫 Thread 類的 run 方法。接下來可以分配并啟動該子類的實例
 * 實現接口:聲明實現 Runnable 接口的類,該類然后實現 run 方法。
 * 然后可以分配該類的實例,在創建 Thread 時作為一個參數來傳遞并啟動。
 * */
public class Thread_jichu { 
    
    public static void print(){
        for(int i=1;i<=50;i++){
            System.out.println("who看校花的貼身高手:第"+i+"集,看的挺嗨的!");
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
    public static void main(String[] args) {
        Thread t = new Play();  
        Live l = new Live();    
        Thread t1 = new Thread(l);
        t1.start();
        t.start();
        
        print();
    }
}

2.線程安全和同步:

package Thread;

public class Synchronized_tongbu {
    public static void main(String[] args) {
        BankAccount account = new BankAccount();
        Thread husband = new BankThread(account);
        Thread wife = new BankThread(account);
        husband.start();
        wife.start();
    }
}
class BankAccount{
    private double balance = 1000;
    public boolean depasit(double newAdd){
        if(newAdd <=0){
            return false;           
        }else{
            synchronized(this){//鎖方法和鎖局域代碼
                System.out.println("當前余額為:"+balance);
                try {
                    Thread.sleep(5);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                balance = balance + newAdd;
            }
            System.out.println("新的余額為:" + balance);
        }
        return true;    
    }
}
class BankThread extends Thread{
    private BankAccount bankAccount;
    public BankThread(BankAccount account){
        bankAccount = account;
    }
    public void run(){
        bankAccount.depasit(200);
    }
    
}
死鎖
package Thread;
/*
 * 由于加鎖,所以在取資源時某一方沒有使用完不得進入該空間。
 * 
 * */
public class DeadLock {

    public static void main(String[] args) {
        Object object1 = new  Object();
        Object object2 = new  Object();
        Thread ta = new A(object1, object2);
        Thread tb = new B(object1, object2);
        ta.start();
        tb.start();
    }

}

class A extends Thread {
    Object object1;
    Object object2;

    public A(Object object1, Object object2) {
        this.object1 = object1;
        this.object2 = object2;
    }

    public void run() {
        synchronized (object1) {
            System.out.println("A取到了object1");
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized(object2){
                System.out.println("A拿到了object1和object2");
        }
        }
    }
}

class B extends Thread {
    public Object object1;
    public Object object2;

    public B(Object object1, Object object2) {
        this.object1 = object1;
        this.object2 = object2;
    }

    public void run() {
        synchronized (object2) {
            System.out.println("B取到了object1");
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized(object1){
                System.out.println("B拿到了object1和object2");
        }
        }
    }
}
如上代碼會出現死鎖,未能A B都未能取到所需,將B run方法中object2 object1調換即可。取得順序相同很慶幸解決了問題。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容