0
点赞
收藏
分享

微信扫一扫

android 利用集合简单实现队列思想

爱薇Ivy趣闻 2022-02-18 阅读 66

话不多说直接看代码

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);

哪里不对的地方 大家可以指出来

举报

相关推荐

0 条评论