美文网首页
关于线程池单例的使用

关于线程池单例的使用

作者: 壹树YS | 来源:发表于2017-11-22 17:55 被阅读0次

    我们在开发项目过程中肯定会常常使用到多线程,如果你做的APP越来越大越来越复杂或者说异步操作的过程越来越多的话,那么对于多线程的使用就会越来越多,而这时候就的需要对于线程进行有效的管理了。
    很不错的是Java当中就已经有了线程池的方式来对线程进行管理了,然而我们在使用的过程中在不同的界面需要自己手动创建这个线程池,然后再使用,那么有没有一种方式是可以统一对线程进行管理呢。经过我的一些思考,想到了可以通过创建线程的单例模式来对线程进行同意管理,这样一方面可以监控到所有使用到异步线程的操作,也可以进行自定义的控制。

    下面附上我的线程池单例模式的代码,代码很简单。

    public class ThreadPoolSingleton {
        private ExecutorService executorService;
        private final int availableProcessor = Runtime.getRuntime().availableProcessors();
        private ThreadPoolSingleton() {
            if (executorService == null) {
                int coreNum = availableProcessor / 2;
                
                // 用单例模式创建线程池,保留2个核心线程,最多线程为CPU个数的2n+1的两倍.
                int maxProcessor = (availableProcessor * 2 + 1) * 2 ;
    
                executorService = new ThreadPoolExecutor(coreNum > 2 ? 2 : coreNum, maxProcessor,
                        60L, TimeUnit.SECONDS,
                        new SynchronousQueue<Runnable>());
            }
        }
    
    
        private static ThreadPoolSingleton instance;
    
        public static ThreadPoolSingleton getInstance() {
            if (instance == null) {
                instance = new ThreadPoolSingleton();
            }
            return instance;
        }
    
        int executeThreadNum = 1;
        public void executeTask(Runnable runnable) {
            executorService.execute(runnable);
           Log.d("ThreadPoolSingleton ", String.format("异步线程执行了%d次。", executeThreadNum++));
        }
    
    //    /**这个方法可根据你的需要添加*/
    //    public <T> Future<T> submit(Runnable task, T result){
    //        return executorService.submit(task, result);
    //    }
    //
    //    /**这个方法可根据你的需要添加*/
    //    public Future<?> submit(Runnable task){
    //        return executorService.submit(task);
    //    }
    }
    

    用法

    将以上的代码复制到你的项目中。
    在你需要直接使用的异步操作的地方直接调用就可以了。

    例子:

    ThreadPoolSingleton.getInstance().executeTask(new Runnable() {
        @Override
        public void run() {
            //在这里写上你需要异步操作的代码
        }
    });
    

    上面的用法是不是超级简单。而且异步线程也很方便的进行管理,也可以看到你的APP运行期间运行了多少次异步操作。

    欢迎转载,转载请注明出处!

    相关文章

      网友评论

          本文标题:关于线程池单例的使用

          本文链接:https://www.haomeiwen.com/subject/mnjovxtx.html