package com.hundsun.jresplus.common.util;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.LinkedBlockingQueue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class BlockingQueueLocate {
private static final Logger logger = LoggerFactory
.getLogger(BlockingQueueLocate.class);
private static final String Jdk7LinkedTransferQueue = "java.util.concurrent.LinkedTransferQueue";
private static final String Jsr166yLinkedTransferQueue = "jsr166y.LinkedTransferQueue";
private static Class<?> queueClass = findQueueClass();
private static Class<?> findQueueClass() {
Class<?> clazz;
ClassLoader classLoader = Thread.currentThread()
.getContextClassLoader();
try {
clazz = classLoader.loadClass(Jdk7LinkedTransferQueue);
if (logger.isDebugEnabled()) {
logger.debug("use " + Jdk7LinkedTransferQueue);
}
return clazz;
} catch (ClassNotFoundException ignore) {
if (logger.isDebugEnabled()) {
logger.debug(Jdk7LinkedTransferQueue + " not find.");
}
}
try {
clazz = classLoader.loadClass(Jsr166yLinkedTransferQueue);
if (logger.isDebugEnabled()) {
logger.debug("use " + Jsr166yLinkedTransferQueue);
}
return clazz;
} catch (ClassNotFoundException e) {
if (logger.isDebugEnabled()) {
logger.debug(Jsr166yLinkedTransferQueue + " not find.");
}
}
// ConcurrentLinkedQueue从jdk1.5开始就有了
if (logger.isDebugEnabled()) {
logger.debug("use " + ConcurrentLinkedQueue.class);
}
return LinkedBlockingQueue.class;
}
@SuppressWarnings("unchecked")
public static <T> BlockingQueue<T> createBlockingQueue() {
try {
return (BlockingQueue<T>) queueClass.newInstance();
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}