<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ā)表評論。


    網站導航:
     
    主站蜘蛛池模板: 精品熟女少妇AV免费观看| baoyu116.永久免费视频| 国产精品视频免费| 亚洲综合激情另类小说区| 无码人妻一区二区三区免费n鬼沢| 日韩va亚洲va欧洲va国产| 永久免费不卡在线观看黄网站| 亚洲国产精品一区二区成人片国内| 久久久久久噜噜精品免费直播| 久久久久亚洲精品男人的天堂 | 中文字幕无码播放免费| 337p日本欧洲亚洲大胆色噜噜| 麻花传媒剧在线mv免费观看| 亚洲国产模特在线播放| 午夜免费福利在线观看| 美女免费精品高清毛片在线视| 亚洲精品人成无码中文毛片| a级成人毛片免费图片| 亚洲国产美国国产综合一区二区| 无遮免费网站在线入口| 亚洲AV一区二区三区四区| 亚洲福利视频一区二区| 大地资源网高清在线观看免费| 亚洲欧洲视频在线观看| 日本黄页网站免费| 美女无遮挡拍拍拍免费视频| 亚洲一区免费观看| 日本高清免费网站| 免费毛片在线看不用播放器| 亚洲国产精品久久丫| 免费a级毛片无码av| 最好免费观看高清在线| 国产AV旡码专区亚洲AV苍井空| va亚洲va日韩不卡在线观看| 久久99免费视频| 亚洲第一第二第三第四第五第六| 亚洲熟妇无码八AV在线播放| 99精品国产免费久久久久久下载| aa午夜免费剧场| 亚洲国产av高清无码| 中文字幕亚洲日韩无线码|