JAVA多執行緒機制第四彈:(末篇)執行緒常用方法總結和執行緒同步
阿新 • • 發佈:2018-12-19
執行緒的常用方法:
這裡我覺得這個老師的教案總結的很舒胡(主要是懶~):
執行緒同步:
在處理多執行緒問題時,有一個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的多執行緒機制就簡單學到這裡啦~