<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 1, comments - 0, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    探索java多線程(連載)1 守護線程

    Posted on 2011-03-22 19:25 ikon 閱讀(2084) 評論(0)  編輯  收藏

          在java中有一類線程,專門在后臺提供服務,此類線程無需顯式關閉,當程序結束了,它也就結束了,這就是守護線程 daemon thread。如果還有非守護線程的線程在執(zhí)行,它就不會結束。      守護線程有何用處呢?讓我們來看個實踐中的例子。

          在我們的系統(tǒng)中經常應用各種配置文件(黑名單,禁用詞匯),當修改配置文件后,一般要重啟服務,系統(tǒng)才能夠加載;當重啟服務的代價比較高的情況下,這種加載方式不能滿足我們的要求,這個時候守護線程該發(fā)揮它的作用了,它可以實時加載你的配置文件,無需重啟。(當然,相當重要的配置文件,不推薦實時加載)

    package com.ikon.thread.daemon;

    import java.io.File;
    import java.util.*;

    /**
     * 文件監(jiān)測
     * 
    @author ikon99999
     * 
     
    */

    public abstract class FileWatchdog extends Thread {

     
      
    static final public long DEFAULT_DELAY = 20*1000
     
      
      
    protected HashMap fileList;
     
      
    protected long delay = DEFAULT_DELAY; 
      
      
    boolean warnedAlready = false;
      
      
    boolean interrupted = false;

      
    public static class Entity
      
    {
            File file;
            
    long lastModify;
            Entity(File file,
    long lastModify)
            
    {
                
    this.file = file;
                
    this.lastModify = lastModify;
            }

      }

      
      
    protected  FileWatchdog() {
          fileList 
    = new HashMap ();
        setDaemon(
    true);
      }


     
      
    public  void setDelay(long delay) {
        
    this.delay = delay;
      }


      
    public void addFile(File file)
      
    {
            fileList.put(file.getAbsolutePath(),
    new Entity(file,file.lastModified()));     
      }

      
      
    public boolean contains(File file)
      
    {
            
    if( fileList.get(file.getAbsolutePath()) != nullreturn true;
            
    else return false;
      }

      
      
    abstract   protected   void doOnChange(File file);

      
    protected  void checkAndConfigure() {
          HashMap map 
    = (HashMap)fileList.clone(); 
          Iterator it 
    = map.values().iterator();
          
          
    while( it.hasNext())
          
    {
              
                Entity entity 
    = (Entity)it.next();
                
                
    boolean fileExists;
                
    try {
                  fileExists 
    = entity.file.exists();
                }
     catch(SecurityException  e) 
                
    {
                  System.err.println (
    "Was not allowed to read check file existance, file:["+ entity.file .getAbsolutePath() +"].");
                  interrupted 
    = true
                  
    return;
                }


                
    if(fileExists) 
                
    {
                    
                  
    long l = entity.file.lastModified(); // this can also throw a SecurityException
                  if(l > entity.lastModify) {           // however, if we reached this point this
                        entity.lastModify = l;              // is very unlikely.
                        newThread(entity.file);
                  }

                }

                
    else 
                
    {
                    System.err.println (
    "["+entity.file .getAbsolutePath()+"] does not exist.");
                }

          }

      }

      
      
    private void newThread(File file)
      
    {
          
    class MyThread extends Thread
          
    {
                File f;
                
    public MyThread(File f)
                
    {
                    
    this.f = f;
                }

                
                
    public void run()
                
    {
                    doOnChange(f);
                }

          }

          
          MyThread mt 
    = new MyThread(file);
          mt.start();
      }


      
    public  void run() 
      
    {    
        
    while(!interrupted) {
          
    try {
            Thread.currentThread().sleep(delay);
          }
     catch(InterruptedException e) {
        
    // no interruption expected
          }

          checkAndConfigure();
        }

      }

    }

        FileWatchdog是個抽象類,本身是線程的子類;在構造函數(shù)中設置為守護線程;
        此類用hashmap維護著一個文件和最新修改時間值對,checkAndConfigure()方法用來檢測哪些文件的修改時間更新了,如果發(fā)現(xiàn)文件更新了則調用doOnChange方法來完成監(jiān)測邏輯;doOnChange方法是我們需要實現(xiàn)的;看下面關于一個黑名單服務的監(jiān)測服務:
          

     1package com.ikon.thread.daemon;
     2
     3import java.io.File;
     4
     5/**
     6 * 黑名單服務
     7 * @author ikon99999
     8 * 2011-3-21
     9 */

    10public 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()+"發(fā)生改變,重新加載");
    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

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

            其實上面的FileWatchdog就是取自log4j;
            

    只有注冊用戶登錄后才能發(fā)表評論。


    網站導航:
     
    主站蜘蛛池模板: EEUSS影院WWW在线观看免费 | 色偷偷亚洲女人天堂观看欧| 一个人看的www在线观看免费| 亚洲成AV人片高潮喷水| 午夜亚洲av永久无码精品| 国产婷婷成人久久Av免费高清| 亚洲国产成人精品无码一区二区 | 丁香花免费高清视频完整版| 边摸边脱吃奶边高潮视频免费| 婷婷亚洲综合五月天小说 | 亚洲精品视频免费看| 国产一级淫片免费播放电影 | 国产精品亚洲玖玖玖在线观看| 97免费人妻在线视频| 国产亚洲精品美女| 亚洲熟妇无码爱v在线观看| 免费h黄肉动漫在线观看 | 亚洲色图综合在线| 91嫩草国产在线观看免费| 国产高潮流白浆喷水免费A片 | 激情综合亚洲色婷婷五月APP| 亚洲人成无码网站久久99热国产| 四虎最新永久免费视频| 国产免费人成视频尤勿视频| 中文字幕在线观看亚洲日韩| 亚洲AV无码一区二区乱孑伦AS | 免费一看一级毛片人| 精品香蕉在线观看免费| 免费a级毛片无码a∨免费软件| 亚洲国产午夜精品理论片在线播放| 久久精品国产亚洲香蕉| 亚洲精品成人区在线观看| 国产精品免费观看久久| 91香焦国产线观看看免费| gogo免费在线观看| 国产青草亚洲香蕉精品久久| 亚洲乱码在线视频| 亚洲天堂电影在线观看| 亚洲av之男人的天堂网站| 中文字幕一精品亚洲无线一区| 四虎影视精品永久免费|