content: /**
   * (C) 2011-2012 Alibaba Group Holding Limited.
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License
   * version 2 as published by the Free Software Foundation.
   * 
   */
  package com.taobao.profile.thread;
  
  import java.util.Date;
  import java.util.Map;
  import java.util.concurrent.TimeUnit;
  
  import com.taobao.profile.Manager;
  import com.taobao.profile.config.ProfConfig;
  import com.taobao.profile.utils.DailyRollingFileWriter;
  
  /**
   * 调用栈采样线程
   * 
   * @author shutong.dy
   * @since 2012-1-7
   */
  public class SamplerThread extends Thread {
  
  	/**
  	 * log writer
  	 */
  	private final DailyRollingFileWriter fileWriter;
  	/**
  	 * 
  	 */
  	private final int samplerIntervalTime;
  
  	/**
  	 * 线程构造器
  	 * 
  	 * @param config
  	 */
  	public SamplerThread(ProfConfig config) {
  		// 读取配置
  		fileWriter = new DailyRollingFileWriter(config.getSamplerFilePath());
  		samplerIntervalTime = config.getSamplerIntervalTime();
  	}
  
  	/*
  	 * (non-Javadoc)
  	 * 
  	 * @see java.lang.Thread#run()
  	 */
  	public void run() {
  		try {
  			while (true) {
  				if (Manager.instance().canDump()) {
  					Date date = new Date();
  					Map<Thread, StackTraceElement[]> map = Thread.getAllStackTraces();
  					for (Map.Entry<Thread, StackTraceElement[]> entry : map.entrySet()) {
  						Thread thread = entry.getKey();
  						StringBuilder sb = new StringBuilder();
  						sb.append("Thread\t");
  						sb.append(thread.getId());
  						sb.append("\t");
  						sb.append(thread.getName());
  						sb.append("\t");
  						sb.append(thread.getState());
  						sb.append("\t");
  						sb.append(date);
  						sb.append("\n");
  						fileWriter.append(sb.toString());
  						for (StackTraceElement element : entry.getValue()) {
  							fileWriter.append(element.toString());
  							fileWriter.append("\n");
  						}
  						fileWriter.flushAppend();
  					}
  				}
  				// sleep
  				TimeUnit.SECONDS.sleep(samplerIntervalTime);
  			}
  		} catch (Exception e) {
  			e.printStackTrace();
  		} finally {
  			if (fileWriter != null) {
  				fileWriter.closeFile();
  			}
  		}
  	}
  }
  