com.feilong.lib.xstream.core.util.ThreadSafeSimpleDateFormat Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of feilong Show documentation
Show all versions of feilong Show documentation
feilong is a suite of core and expanded libraries that include utility classes, http, excel,cvs, io classes, and much much more.
/*
* Copyright (C) 2004, 2005 Joe Walnes.
* Copyright (C) 2006, 2007, 2009, 2011, 2012 XStream Committers.
* All rights reserved.
*
* The software in this package is published under the terms of the BSD
* style license a copy of which has been included with this distribution in
* the LICENSE.txt file.
*
* Created on 06. May 2004 by Joe Walnes
*/
package com.feilong.lib.xstream.core.util;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
/**
* Wrapper around java.text.SimpleDateFormat that can
* be called by multiple threads concurrently.
*
* SimpleDateFormat has a high overhead in creating
* and is not thread safe. To make best use of resources,
* the ThreadSafeSimpleDateFormat provides a dynamically
* sizing pool of instances, each of which will only
* be called by a single thread at a time.
*
*
* The pool has a maximum capacity, to limit overhead.
* If all instances in the pool are in use and another is
* required, it shall block until one becomes available.
*
*
* @author Joe Walnes
* @author Jörg Schaible
*/
public class ThreadSafeSimpleDateFormat{
private final String formatString;
private final Pool pool;
private final TimeZone timeZone;
public ThreadSafeSimpleDateFormat(String format, TimeZone timeZone, int initialPoolSize, int maxPoolSize, final boolean lenient){
this(format, timeZone, Locale.ENGLISH, initialPoolSize, maxPoolSize, lenient);
}
public ThreadSafeSimpleDateFormat(String format, TimeZone timeZone, final Locale locale, int initialPoolSize, int maxPoolSize,
final boolean lenient){
formatString = format;
this.timeZone = timeZone;
pool = new Pool(initialPoolSize, maxPoolSize, () -> {
SimpleDateFormat dateFormat = new SimpleDateFormat(formatString, locale);
dateFormat.setLenient(lenient);
return dateFormat;
});
}
public String format(Date date){
DateFormat format = fetchFromPool();
try{
return format.format(date);
}finally{
pool.putInPool(format);
}
}
public Date parse(String date) throws ParseException{
DateFormat format = fetchFromPool();
try{
return format.parse(date);
}finally{
pool.putInPool(format);
}
}
private DateFormat fetchFromPool(){
DateFormat format = (DateFormat) pool.fetchFromPool();
TimeZone tz = timeZone != null ? timeZone : TimeZone.getDefault();
if (!tz.equals(format.getTimeZone())){
format.setTimeZone(tz);
}
return format;
}
@Override
public String toString(){
return formatString;
}
}