一个简单的线程池管理线程上传下载任务
/**线程池管理
* @author qiumeng
* @Package com.itrus.laweyecloud.thread
* @Description:
* @date 2018 2018/1/19 11:15
*/
@Component
public class ThreadPoolManager {
@Autowired
private ThreadPoolManager tpm;
// 线程池维护线程的最少数量
private final static int CORE_POOL_SIZE = 4;
// 线程池维护线程的最大数量
private final static int MAX_POOL_SIZE = 10;
// 线程池维护线程所允许的空闲时间
private final static int KEEP_ALIVE_TIME = 0;
// 线程池所使用的缓冲队列大小
private final static int WORK_QUEUE_SIZE = 10;
// 消息缓冲队列
Queue<Object> objectQueue = new LinkedList<Object>();
// 访问消息缓存的调度线程
// 查看是否有待定请求,如果有,则创建一个新的AccessDBThread,并添加到线程池中
final Runnable accessBufferThread = new Runnable() {
@Override
public void run() {
if (hasMoreAcquire()) {
//取出消息队列的头一个信息
Object object = objectQueue.poll();
if(object instanceof FileOfBillWrap){
fileUploadThread task=new fileUploadThread(((FileOfBillWrap)object));
threadPool.execute(task);
}else if( object instanceof FileOfBill){
fileDownThread task=new fileDownThread((FileOfBill) object);
threadPool.execute(task);
}
}
}
};
//一个没有能够被线程池执行的消息,重新放入消息队列中
final RejectedExecutionHandler handler = new RejectedExecutionHandler() {
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
objectQueue.offer(r);
}
};
//重新定义线程池初始化参数
@SuppressWarnings({ "rawtypes", "unchecked" })
final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME,
TimeUnit.SECONDS, new ArrayBlockingQueue(WORK_QUEUE_SIZE), this.handler);
// 定义线程池调度任务
final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(100);
@SuppressWarnings("rawtypes")
final ScheduledFuture taskHandler = scheduler.scheduleAtFixedRate(accessBufferThread, 0, 1, TimeUnit.SECONDS);
public ThreadPoolManager newInstance() {
return tpm;
}
/**判断队列是否为空*/
public boolean hasMoreAcquire() {
return !objectQueue.isEmpty();
}
@Autowired
private fileDownThread fileDownThread;
@Autowired
private fileUploadThread fileUploadThread;
/**
* 放入文件上传任务
*/
public void putFileUploadThread(FileOfBillWrap fileOfBillWrap){
fileUploadThread.setFileOfBillWrap(fileOfBillWrap);
threadPool.execute(fileUploadThread);
}
/**
* 放入文件下载任务
*/
public void putFileDownThread(FileOfBill fileOfBill){
fileDownThread.setFileOfBill(fileOfBill);
threadPool.execute(fileDownThread);
}
}
上传文件线程
/**
* @author qiumeng
* @Package com.itrus.laweyecloud.thread
* @Description:
* @date 2018 2018/1/19 11:11
*/
@Component
@Transactional(readOnly = false, rollbackFor = Exception.class)
public class fileUploadThread implements Runnable {
private static Logger log = Logger.getLogger(fileUploadThread.class);
private fileUploadThread(){};
private FileOfBillWrap fileOfBillWrap;
public fileUploadThread(FileOfBillWrap fileOfBillWrap) {
this.fileOfBillWrap = fileOfBillWrap;
}
public FileOfBillWrap getFileOfBillWrap() {
return fileOfBillWrap;
}
public void setFileOfBillWrap(FileOfBillWrap fileOfBillWrap) {
this.fileOfBillWrap = fileOfBillWrap;
}
@Override
public void run() {
//上传文件到什么地方以及后续操作
}
}
下载文件线程
/**
* @author qiumeng
* @Package com.itrus.laweyecloud.thread
* @Description:
* @date 2018 2018/1/19 10:47
*/
@Component
public class fileDownThread implements Runnable {
private static Logger log = Logger.getLogger(fileDownThread.class);
private FileOfBill fileOfBill;
private fileDownThread() {
}
public fileDownThread(FileOfBill fileOfBill) {
this.fileOfBill = fileOfBill;
}
public FileOfBill getFileOfBill() {
return fileOfBill;
}
public void setFileOfBill(FileOfBill fileOfBill) {
this.fileOfBill = fileOfBill;
}
@Override
public void run(){
//下载文件到什么地方以及后续操作
}
}