// Path: ddth-commons-core/src/main/java/com/github/ddth/commons/utils/DateFormatUtils.java
// public class DateFormatUtils {
// 
//     /**
//      * @since 0.7.0
//      */
//     public final static String DF_ISO8601 = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
// 
//     /**
//      * @since 0.2.2.3
//      */
//     private final static class MyDateFormat extends SimpleDateFormat {
//         private static final long serialVersionUID = 1L;
//         private final UUID id = UUID.randomUUID();
// 
//         public MyDateFormat(String format) {
//             super(format);
//         }
// 
//         @Override
//         public boolean equals(Object o) {
//             if (this == o) {
//                 return true;
//             }
//             if (!(o instanceof MyDateFormat)) {
//                 return false;
//             }
// 
//             MyDateFormat that = (MyDateFormat) o;
//             if (id != null ? !id.equals(that.id) : that.id != null) {
//                 return false;
//             }
// 
//             return true;
//         }
// 
//         @Override
//         public int hashCode() {
//             return id != null ? id.hashCode() : 0;
//         }
//     }
// 
//     private final static class DateFormatFactory extends BasePooledObjectFactory<DateFormat> {
//         private String format;
// 
//         public DateFormatFactory(String format) {
//             this.format = format;
//         }
// 
//         /**
//          * {@inheritDoc}
//          */
//         @Override
//         public DateFormat create() throws Exception {
//             return new MyDateFormat(format);
//         }
// 
//         /**
//          * {@inheritDoc}
//          */
//         @Override
//         public PooledObject<DateFormat> wrap(DateFormat df) {
//             return new DefaultPooledObject<DateFormat>(df);
//         }
//     }
// 
//     private final static LoadingCache<String, ObjectPool<DateFormat>> cachedDateFormat = CacheBuilder
//             .newBuilder().maximumSize(100).expireAfterAccess(3600, TimeUnit.SECONDS)
//             .concurrencyLevel(2)
//             .removalListener(new RemovalListener<String, ObjectPool<DateFormat>>() {
//                 @Override
//                 public void onRemoval(RemovalNotification<String, ObjectPool<DateFormat>> event) {
//                     event.getValue().close();
//                 }
//             }).build(new CacheLoader<String, ObjectPool<DateFormat>>() {
//                 @Override
//                 public ObjectPool<DateFormat> load(String format) throws Exception {
//                     DateFormatFactory dff = new DateFormatFactory(format);
//                     ObjectPool<DateFormat> obj = new GenericObjectPool<DateFormat>(dff);
//                     return obj;
//                 }
//             });
// 
//     /**
//      * Convert a {@link Date} to string, based on the specified {@code format}.
//      * 
//      * @param date
//      * @param format
//      * @return
//      * @see {@link SimpleDateFormat}
//      */
//     public static String toString(Date date, String format) {
//         try {
//             ObjectPool<DateFormat> pool = cachedDateFormat.get(format);
//             try {
//                 DateFormat df = pool.borrowObject();
//                 try {
//                     return df.format(date);
//                 } finally {
//                     pool.returnObject(df);
//                 }
//             } catch (Exception e) {
//                 throw e instanceof RuntimeException ? (RuntimeException) e
//                         : new RuntimeException(e);
//             }
//         } catch (ExecutionException e) {
//             throw new RuntimeException(e);
//         }
//     }
// 
//     /**
//      * Convert a {@link Calendar} to string, based on the specified {@code format}.
//      * 
//      * @param calendar
//      * @param format
//      * @return
//      * @see {@link SimpleDateFormat}
//      * @since 0.9.1.1
//      */
//     public static String toString(Calendar calendar, String format) {
//         return toString(calendar.getTime(), format);
//     }
// 
//     /**
//      * Parse a string to {@link Date}, based on the specified {@code format}.
//      * 
//      * @param source
//      * @param format
//      * @return
//      */
//     public static Date fromString(String source, String format) {
//         try {
//             ObjectPool<DateFormat> pool = cachedDateFormat.get(format);
//             try {
//                 DateFormat df = pool.borrowObject();
//                 try {
//                     return df.parse(source);
//                 } finally {
//                     pool.returnObject(df);
//                 }
//             } catch (Exception e) {
//                 throw e instanceof RuntimeException ? (RuntimeException) e
//                         : new RuntimeException(e);
//             }
//         } catch (ExecutionException e) {
//             throw new RuntimeException(e);
//         }
//     }
// }


import java.util.Date;
import com.github.ddth.commons.utils.DateFormatUtils;
package com.github.ddth.commons.qnd.utils;



public class QndDateFormatUtil {

    public static void main(String[] args) {
        final String DF = "yyyy-MM-dd";
        final String INPUT = "2014-09-29";

        for (int i = 0; i < 16; i++) {
            Thread t = new Thread() {
                public void run() {
                    for (int j = 0; j < 100; j++) {
// Path: ddth-commons-core/src/main/java/com/github/ddth/commons/utils/DateFormatUtils.java
// public class DateFormatUtils {
// 
//     /**
//      * @since 0.7.0
//      */
//     public final static String DF_ISO8601 = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
// 
//     /**
//      * @since 0.2.2.3
//      */
//     private final static class MyDateFormat extends SimpleDateFormat {
//         private static final long serialVersionUID = 1L;
//         private final UUID id = UUID.randomUUID();
// 
//         public MyDateFormat(String format) {
//             super(format);
//         }
// 
//         @Override
//         public boolean equals(Object o) {
//             if (this == o) {
//                 return true;
//             }
//             if (!(o instanceof MyDateFormat)) {
//                 return false;
//             }
// 
//             MyDateFormat that = (MyDateFormat) o;
//             if (id != null ? !id.equals(that.id) : that.id != null) {
//                 return false;
//             }
// 
//             return true;
//         }
// 
//         @Override
//         public int hashCode() {
//             return id != null ? id.hashCode() : 0;
//         }
//     }
// 
//     private final static class DateFormatFactory extends BasePooledObjectFactory<DateFormat> {
//         private String format;
// 
//         public DateFormatFactory(String format) {
//             this.format = format;
//         }
// 
//         /**
//          * {@inheritDoc}
//          */
//         @Override
//         public DateFormat create() throws Exception {
//             return new MyDateFormat(format);
//         }
// 
//         /**
//          * {@inheritDoc}
//          */
//         @Override
//         public PooledObject<DateFormat> wrap(DateFormat df) {
//             return new DefaultPooledObject<DateFormat>(df);
//         }
//     }
// 
//     private final static LoadingCache<String, ObjectPool<DateFormat>> cachedDateFormat = CacheBuilder
//             .newBuilder().maximumSize(100).expireAfterAccess(3600, TimeUnit.SECONDS)
//             .concurrencyLevel(2)
//             .removalListener(new RemovalListener<String, ObjectPool<DateFormat>>() {
//                 @Override
//                 public void onRemoval(RemovalNotification<String, ObjectPool<DateFormat>> event) {
//                     event.getValue().close();
//                 }
//             }).build(new CacheLoader<String, ObjectPool<DateFormat>>() {
//                 @Override
//                 public ObjectPool<DateFormat> load(String format) throws Exception {
//                     DateFormatFactory dff = new DateFormatFactory(format);
//                     ObjectPool<DateFormat> obj = new GenericObjectPool<DateFormat>(dff);
//                     return obj;
//                 }
//             });
// 
//     /**
//      * Convert a {@link Date} to string, based on the specified {@code format}.
//      * 
//      * @param date
//      * @param format
//      * @return
//      * @see {@link SimpleDateFormat}
//      */
//     public static String toString(Date date, String format) {
//         try {
//             ObjectPool<DateFormat> pool = cachedDateFormat.get(format);
//             try {
//                 DateFormat df = pool.borrowObject();
//                 try {
//                     return df.format(date);
//                 } finally {
//                     pool.returnObject(df);
//                 }
//             } catch (Exception e) {
//                 throw e instanceof RuntimeException ? (RuntimeException) e
//                         : new RuntimeException(e);
//             }
//         } catch (ExecutionException e) {
//             throw new RuntimeException(e);
//         }
//     }
// 
//     /**
//      * Convert a {@link Calendar} to string, based on the specified {@code format}.
//      * 
//      * @param calendar
//      * @param format
//      * @return
//      * @see {@link SimpleDateFormat}
//      * @since 0.9.1.1
//      */
//     public static String toString(Calendar calendar, String format) {
//         return toString(calendar.getTime(), format);
//     }
// 
//     /**
//      * Parse a string to {@link Date}, based on the specified {@code format}.
//      * 
//      * @param source
//      * @param format
//      * @return
//      */
//     public static Date fromString(String source, String format) {
//         try {
//             ObjectPool<DateFormat> pool = cachedDateFormat.get(format);
//             try {
//                 DateFormat df = pool.borrowObject();
//                 try {
//                     return df.parse(source);
//                 } finally {
//                     pool.returnObject(df);
//                 }
//             } catch (Exception e) {
//                 throw e instanceof RuntimeException ? (RuntimeException) e
//                         : new RuntimeException(e);
//             }
//         } catch (ExecutionException e) {
//             throw new RuntimeException(e);
//         }
//     }
// }


// Path: ddth-commons-core/src/test/java/com/github/ddth/commons/qnd/utils/QndDateFormatUtil.java
import java.util.Date;
import com.github.ddth.commons.utils.DateFormatUtils;

package com.github.ddth.commons.qnd.utils;



public class QndDateFormatUtil {

    public static void main(String[] args) {
        final String DF = "yyyy-MM-dd";
        final String INPUT = "2014-09-29";

        for (int i = 0; i < 16; i++) {
            Thread t = new Thread() {
                public void run() {
                    for (int j = 0; j < 100; j++) {
                        Date d = DateFormatUtils.fromString(INPUT, DF);