線程互斥(互斥變量)

下面代碼模擬一個場景:java

A使用線程調用B來處理東西,可是B處理的時候須要一個Map,map內容須要從數據庫查數據庫

而這個map會因其餘模塊修改數據庫不斷的變化。ide

爲了保證處理的正確性,須要線程定時更新map,線程

更新map時須要A中止線程,等B更新好map再開始。io

下面代碼map並未出現,class

replace()方法表明更新mapimport

handle()代碼處理變量

 

B中ready做爲互斥變量map

 

 

import java.util.Timer;方法

import java.util.TimerTask;

/**
* 線程互斥
* @author zhuo
*
*/
public class MutualExclusionVariable {
  public static void main(String[] args) {
    A a = new A();
    Timer timer1 = new Timer();
    timer1.schedule(a.task, 0, 100);
    Timer timer2 = new Timer();
    timer2.schedule(a.b.task, 0, 10000);
  }

}

class A{
  B b = new B();
  int i = 1;
  TimerTask task = new TimerTask() {
    @Override
    public void run() {
      sendMessage();
    }
  };
  public void sendMessage() {
    synchronized (b.isReady()) {
      b.handle(String.valueOf(i++));
    }
  }
}

class B {   String ready = "";   TimerTask task = new TimerTask() {     @Override     public void run() {       try {         replace();       } catch (InterruptedException e) {         e.printStackTrace();       }     }   };   public void handle(String str) {     System.out.println(str);   }   public void replace() throws InterruptedException {     synchronized (ready) {       System.out.println("替換中.....");       for (int i = 0; i < 100000; i++) {         for (int j = 0; j < 100000; j++) {           for (int k = 0; k < 1000000; k++) {           }         }       }       System.out.println("替換完成");     }   }   public String isReady(){     return ready;  }}

相關文章
相關標籤/搜索