1.需求
多个线程需要不间断的访问同一个资源,访问方式是只读。该资源需要不断更新,如果资源由访问线程更新会很不方便,比如:访问资源的线程需要通过接口访问改资源,并且需要考虑多个线程同时访问的情况。但如果资源由一个特定线程来维护,而只暴露在外一个提供资源的接口,这样会方便很多。基于这个想法,有了下面的设计。
2.实现
多个线程需要不间断的访问同一个资源,访问方式是只读。该资源需要不断更新,如果资源由访问线程更新会很不方便,比如:访问资源的线程需要通过接口访问改资源,并且需要考虑多个线程同时访问的情况。但如果资源由一个特定线程来维护,而只暴露在外一个提供资源的接口,这样会方便很多。基于这个想法,有了下面的设计。
2.实现
package Test;
import java.util.concurrent.TimeUnit;
/**
* 使用内部线程维护变量持久更新
* @author mingyuan
* 2012-8-16 下午08:07:59
*/
public class Test extends Thread {
public class KeywordNot {
/**
* 变量a
*/
private int a = 0;
/**
* 此变量用来标识变量a是否被初始化
*/
private boolean isFirst = true;
public KeywordNot() {
new Runner().start();//启动维护线程
}
/**
* 内部线程
* @author mingyuan
* 2012-8-16 下午08:01:41
*/
private class Runner extends Thread {
public void run() {
//如果还未初始化完成,休眠
while (isFirst) {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//初始化完成,开始维护此变量a
while (!isFirst) {
System.out.println("a++");
a++;
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
* 暴露在外部的接口,用于提供变量a的值
* @return
*/
public int get() {
if (isFirst) {//尚未初始化,开始初始化
System.out.println("first\t" + a);
a++;
isFirst = false;
return a;
}
//如果已经初始化,直接返回a,这时候他是最新的
return a;
}
}
/**
* 测试线程。每三秒取一次数据
*/
public void run() {
KeywordNot keyowrdNot = new KeywordNot();
while (true) {
System.out.println(keyowrdNot.get());
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new Test().start();//启动测试
}
}