1. 程式人生 > >JAVA多執行緒機制第四彈:(末篇)執行緒常用方法總結和執行緒同步

JAVA多執行緒機制第四彈:(末篇)執行緒常用方法總結和執行緒同步

執行緒的常用方法:

這裡我覺得這個老師的教案總結的很舒胡(主要是懶~):

 執行緒同步:

在處理多執行緒問題時,有一個Bug問題啊:當兩個或多個執行緒同時訪問一個父類變數時,並且一個執行緒需要修改這個變數,(一個執行緒讓變數A增加,另一個執行緒讓變數A減少)。

所有有執行緒同步。

所謂執行緒同步就是若干個執行緒都需要使用一個synchronized修飾的方法,即程式中的若干個執行緒都需要使用一個方法,而這個方法使用synchronized給予了修飾。

多個執行緒呼叫synchronized方法必須遵守同步機制,即一個執行緒在使用,其他執行緒需排隊等待,知道該執行緒使用完畢。

舉得例子

是銀行賬務,同意賬戶可以出賬和進賬,符合要求。

第一步:

package com.suzhou.dajiang;

public class main {
    public static void main(String[] args) {
        Bank bank = new Bank();
        bank.setMoney(200);
        System.out.println("賬上還有餘額200");

        Thread accountant = new Thread(bank);
        accountant.setName("會計");
        Thread cashier = new Thread(bank);
        cashier.setName("出納");

        accountant.start();
        cashier.start();
    }
}

第二步:Bank類,使用runnable介面實現多執行緒

package com.suzhou.dajiang;

public class Bank implements Runnable{
    int money;//餘額

    public void setMoney(int n){//設定進來
        money = n;
    }
    @Override
    public void run() {
        //將進出帳區分開來
        if(Thread.currentThread().getName().equals("會計")){
            savaOrTake(300);
        }
        else if(Thread.currentThread().getName().equals("出納")){
            savaOrTake(150);
        }
    }

    public  synchronized  void savaOrTake(int m){//存取錢的函式

        if(Thread.currentThread().getName().equals("會計")){
           for (int i=0;i<3;i++){//分開存,三次
               money=money+m/3;
               System.out.println(Thread.currentThread().getName()+"存入"+m/3+",賬上還有"+money);
               try {
                   Thread.sleep(1000);
               } catch (Exception e) {
                   e.printStackTrace();
               }
           }
        }
        else if(Thread.currentThread().getName().equals("出納")){
            for (int i=0;i<3;i++){
                money=money-m/3;
                System.out.println(Thread.currentThread().getName()+"取出"+m/3+",賬上還有"+money);
                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

結果:

 

從結果上看,在存入的時候,並沒有受到出納執行緒的干擾;在存入結束之後,出納開始執行,這樣,餘額不會受到干擾

最後,Java的多執行緒機制就簡單學到這裡啦~

真好