线程互斥(互斥变量)

下面代码模拟一个场景: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;  }}

相关文章
相关标签/搜索