守護線程
在java中有一類線程,專門在后臺提供服務,此類線程無需顯式關閉,當程序結束了,它也就結束了,這就是守護線程 daemon thread。如果還有非守護線程的線程在執行,它就不會結束。 守護線程有何用處呢?讓我們來看個實踐中的例子。
在我們的系統中經常應用各種配置文件(黑名單,禁用詞匯),當修改配置文件后,一般要重啟服務,系統才能夠加載;當重啟服務的代價比較高的情況下,這種加載方式不能滿足我們的要求,這個時候守護線程該發揮它的作用了,它可以實時加載你的配置文件,無需重啟。(當然,相當重要的配置文件,不推薦實時加載)






























































































































FileWatchdog是個抽象類,本身是線程的子類;在構造函數中設置為守護線程;
此類用hashmap維護著一個文件和最新修改時間值對,checkAndConfigure()方法用來檢測哪些文件的修改時間更新了,如果發現文件更新了則調用doOnChange方法來完成監測邏輯;doOnChange方法是我們需要實現的;看下面關于一個黑名單服務的監測服務:
1
package com.ikon.thread.daemon;
2
3
import java.io.File;
4
5
/**
6
* 黑名單服務
7
* @author ikon99999
8
* 2011-3-21
9
*/
10
public class BlacklistService {
11
private File configFile = new File("c:/blacklist.txt");
12
13
public void init() throws Exception{
14
loadConfig();
15
ConfigWatchDog dog = new ConfigWatchDog();
16
dog.setName("daemon_demo_config_watchdog");//a
17
dog.addFile(configFile);//b
18
dog.start();//c
19
}
20
21
public void loadConfig(){
22
try{
23
Thread.sleep(1*1000);//d
24
25
System.out.println("加載黑名單");
26
}catch(InterruptedException ex){
27
System.out.println("加載配置文件失敗!");
28
}
29
}
30
31
public File getConfigFile() {
32
return configFile;
33
}
34
35
public void setConfigFile(File configFile) {
36
this.configFile = configFile;
37
}
38
39
40
private class ConfigWatchDog extends FileWatchdog{
41
42
@Override
43
protected void doOnChange(File file) {
44
System.out.println("文件"+file.getName()+"發生改變,重新加載");
45
loadConfig();
46
}
47
48
}
49
50
public static void main(String[] args) throws Exception {
51
BlacklistService service = new BlacklistService();
52
service.init();
53
54
Thread.sleep(60*60*1000);//e
55
}
56
}
57

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

ConfigWatchDog內部類實現了doOnChange(File file)方法,當文件被修改后,watchdog調用doOnChange方法完成重新加載操作;
在blackservice的init方法中初始化watchdog線程;
d:模擬文件加載耗時
e:主要是防止主線程退出;
其實上面的FileWatchdog就是取自log4j;