话不多说直接看代码
public class MessageQueue<T> {
private static final String TAG = MessageQueue.class.getSimpleName();
private static MessageQueue messageQueueInstance;
private static ScheduledExecutorService scheduledExecutorService;
//单例构造
/*
* 1:私有的构造方法
* 2:获取对象 需要静态的公共函数
* 3:注意加锁 方式多线程问题
*/
private MessageQueue(){};
public static MessageQueue getInstance(){
//第一次判断空 避免不需要同步
if(messageQueueInstance == null){
synchronized (MessageQueue.class){
if(messageQueueInstance == null){
messageQueueInstance = new MessageQueue();
//同时初始化线程池 用来定时 周期检测 是否需要处理任务
scheduledExecutorService = Executors.newScheduledThreadPool(5);
}
}
}
return messageQueueInstance;
}
//用来处理任务的接口
private ExecutionInterface executionInterface;
public void setExecutionInterface(ExecutionInterface executionInterface) {
this.executionInterface = executionInterface;
}
//利用线程安全集合实现队列思想 需要
private List<T> messageList = new CopyOnWriteArrayList<T>();
//添加任务
public synchronized void addMessage(T msg){
messageList.add(msg);
}
//需要一个函数来开启线程池
public void startCheckTask(){
if(scheduledExecutorService == null){
Log.d(TAG,"线程池开启失败 请重新尝试");
return;
}
scheduledExecutorService.scheduleWithFixedDelay(messageRunnable,2,1, TimeUnit.SECONDS);//2s 后开启线程任务 间隔1s 周期循环 任务结束后 开始间隔1s
// scheduledExecutorService.scheduleAtFixedRate(messageRunnable,2,1, TimeUnit.SECONDS);//2s 后开启线程任务 间隔1s 周期循环 到点就循环
}
//用来处理逻辑关系
private Runnable messageRunnable = new Runnable() {
@Override
public void run() {
if(messageList == null || messageList.size()<=0){
Log.d(TAG,"当前线程池无任务");
return;
}
Log.d(TAG,"检测到线程池任务 当前任务总数"+messageList.size() + "开始执行");
T message = messageList.get(0);
executionInterface.executionSomeThing();
try {
Thread.sleep(3000);
}catch (Exception e){
}
messageList.remove(message);
Log.d(TAG,"任务执行结束 移除此任务 当前任务总数="+messageList.size());
}
};
public void onDestroy(){
scheduledExecutorService.shutdownNow();
messageList.clear();
}
}
实际调用
MessageQueue.getInstance().setExecutionInterface(this);
MessageQueue.getInstance().startCheckTask();
@Override
public void executionSomeThing() {
Log.d(TAG,"do some Thing");
}
MessageQueue.getInstance().addMessage(T);
哪里不对的地方 大家可以指出来