线程与线程池的应用

简介: 异步任务AsyncTask 源码 地址http://androidxref.com/6.0.1_r10/xref/frameworks/base/core/java/android/os/AsyncTask.java最近在Android开发上遇到线程遇到诸多问题,特此记录下。

异步任务AsyncTask 源码 地址http://androidxref.com/6.0.1_r10/xref/frameworks/base/core/java/android/os/AsyncTask.java

最近在Android开发上遇到线程遇到诸多问题,特此记录下。也希望能为诸君贡献一二。

Code一版

直接使用new Thread


        new Thread(new Runnable() {
                @Override
                public void run() {
                    doSomething();//执行代码(耗时等 数据库操作等)
                }
            }).start();

很明显的弊端,Code中太多地方需要线程的地方,new 了无数个线程。
1.每次new Thread新建对象性能差
2. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,即可能占用过多的系统资源导致死机
3.缺乏更多功能,比如定时执行,定期执行,线程中断。
总之最后很扎心,而且你能想象这放在一个性能很差的Android机里面运行么~~


Code二版

使用定义的线程池


先来个我定义的

/**
 * 线程池管理(线程统一调度管理)
 */
public final class ThreadPoolManager {

    public static class ThreadPoolProxy {
        ThreadPoolExecutor mExecutor;
        private int mCorePoolSize;
        private int mMaximumPoolSize;
        /**
         * @param corePoolSize    核心池的大小
         * @param maximumPoolSize 最大线程数
         */
        public ThreadPoolProxy(int corePoolSize, int maximumPoolSize) {
            mCorePoolSize = corePoolSize;
            mMaximumPoolSize = maximumPoolSize;
        }

        /**
         * 初始化ThreadPoolExecutor
         * 双重检查加锁,只有在第一次实例化的时候才启用同步机制,提高了性能
         */
        private void initThreadPoolExecutor() {
            if (mExecutor == null || mExecutor.isShutdown() || mExecutor.isTerminated()) {
                synchronized (ThreadPoolProxy.class) {
                    if (mExecutor == null || mExecutor.isShutdown() || mExecutor.isTerminated()) {
                        long keepAliveTime = 3000;
                        TimeUnit unit = TimeUnit.MILLISECONDS;
                        BlockingQueue workQueue = new LinkedBlockingDeque<>();
                        ThreadFactory threadFactory = Executors.defaultThreadFactory();
                        RejectedExecutionHandler handler = new ThreadPoolExecutor.DiscardPolicy();

                        mExecutor = new ThreadPoolExecutor(mCorePoolSize, mMaximumPoolSize, keepAliveTime, unit, workQueue,
                                threadFactory, handler);
                    }
                }
            }
        }
        /**
         执行任务和提交任务的区别?
         1.有无返回值
         execute->没有返回值
         submit-->有返回值
         2.Future的具体作用?
         1.有方法可以接收一个任务执行完成之后的结果,其实就是get方法,get方法是一个阻塞方法
         2.get方法的签名抛出了异常===>可以处理任务执行过程中可能遇到的异常
         */
        /**
         * 执行任务
         */
        public void execute(Runnable task) {
            initThreadPoolExecutor();
            mExecutor.execute(task);
        }

        /**
         * 提交任务
         */
        public Future submit(Runnable task) {
            initThreadPoolExecutor();
            return mExecutor.submit(task);
        }

        /**
         * 移除任务
         */
        public void remove(Runnable task) {
            initThreadPoolExecutor();
            mExecutor.remove(task);
        }
    }

    /**
     * 线程池工厂类
     * Created by Samson on 2018/2/11.
     * 使用方法
     * ThreadPoolProxyFactory .getNormalThreadPoolProxy().execute(Runnable);
     */

    public static class ThreadPoolProxyFactory {
        private static ThreadPoolProxy mNormalThreadPoolProxy;
        private static ThreadPoolProxy mDownLoadThreadPoolProxy;

        /**
         * 得到普通线程池代理对象mNormalThreadPoolProxy
         */
        public static ThreadPoolProxy getNormalThreadPoolProxy() {
            if (mNormalThreadPoolProxy == null) {
                synchronized (ThreadPoolProxyFactory.class) {
                    if (mNormalThreadPoolProxy == null) {
                        mNormalThreadPoolProxy = new ThreadPoolProxy(10 , 10);
                    }
                }
            }
            return mNormalThreadPoolProxy;
        }
        /**
         * 下载专用
         * 得到下载线程池代理对象mDownLoadThreadPoolProxy
         */
        public static ThreadPoolProxy getDownLoadThreadPoolProxy() {
            if (mDownLoadThreadPoolProxy == null) {
                synchronized (ThreadPoolProxyFactory.class) {
                    if (mDownLoadThreadPoolProxy == null) {
                        mDownLoadThreadPoolProxy = new ThreadPoolProxy(3, 3);
                    }
                }
            }
            return mDownLoadThreadPoolProxy;
        }
    }
}

如何使用:

ThreadPoolManager.ThreadPoolProxyFactory.getNormalThreadPoolProxy()
                  .execute(new Runnable() {
                                  @Override
                                    public void run() {
                                          doSomething();
                                     }
                 });
-----------------------------------------lambda
ThreadPoolManager.ThreadPoolProxyFactory.getNormalThreadPoolProxy()
        .execute(() -> {doSomething();});

Code三版

手动控制版线程池(将所有事务分类放在规定的线程中执行,(未不同类别的事务规定不同的线程))


/**
 * 本地数据处理和耗时处理用不同线程处理
 */

public class ThreadPoolUtil {

    private List<Run> runList = new ArrayList<>();
    private List<Run> runListTemp = new ArrayList<>();
    private Thread thread = null;

    public interface Run {
        void run();
    }

    private ThreadPoolUtil() {
        init();
    }

    private void init() {
        if (thread == null) {
            thread = new Thread(() -> {
                for (; ; ) {
                    synchronized (lock) {
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    dealRun();
                }
            });
            thread.start();
        }
    }

    private final Object lock = new Object();
    private static ThreadPoolUtil _INSTANCESEND = null;
    private static ThreadPoolUtil _INSTANCESERVER = null;
    private static ThreadPoolUtil _INSTANCENORMAL = null;

    /**
     *  发消息
     * @return
     */
    public static ThreadPoolUtil getSendMsgInstance() {
        if (_INSTANCESEND == null) {
            _INSTANCESEND = new ThreadPoolUtil();
        }
        return _INSTANCESEND;
    }
    /**
     *  收消息
     * @return
     */
    public static ThreadPoolUtil getGetMsgInstance() {
        if (_INSTANCESERVER == null) {
            _INSTANCESERVER = new ThreadPoolUtil();
        }
        return _INSTANCESERVER;
    }
    /**
     *  普通通用消息
     * @return
     */
    public static ThreadPoolUtil getNormalInstance() {
        if (_INSTANCENORMAL == null) {
            _INSTANCENORMAL = new ThreadPoolUtil();
        }
        return _INSTANCENORMAL;
    }


    public void addRun(Run run) {
        runListTemp.add(run);
        synchronized (lock) {
            runList.addAll(runListTemp);
            runListTemp.clear();
            lock.notify();
        }
    }

    private Run getRun() {
        if (runList.size() <= 0) {
            return null;
        }
        Run run = null;
        synchronized (lock) {
            run = runList.get(0);
            runList.remove(0);
        }
        return run;
    }

    private void dealRun() {
        try {
            for (Run run = getRun(); (run) != null; ) {
                run.run();
                run = getRun();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

如何使用:不同的分类可 get 不同的线程来处理。

ThreadPoolUtil.getNormalInstance().addRun(new ThreadPoolUtil.Run() {
                @Override
                public void run() {
                     doSomething();
                }
            });
-----------------------------------------lambda
ThreadPoolUtil.getNormalInstance().addRun(() ->{
                doSomething();
            });

2,3两种方式 区别

2方式一旦有线程操作失误可能会导致全线线程瘫痪,导致整个线程池无法正常的运行下去,
3方式使用失误 基本只会导致其一线程瘫痪,更易于查找 修复。

至于其他优势 仍在探究中...

如有纰漏 敬请斧正

目录
相关文章
|
1月前
|
Java C#
C#学习系列相关之多线程(五)----线程池ThreadPool用法
C#学习系列相关之多线程(五)----线程池ThreadPool用法
|
1月前
|
Java 调度 Android开发
构建高效Android应用:探究Kotlin多线程编程
【2月更文挑战第17天】 在现代移动开发领域,性能优化一直是开发者关注的焦点。特别是在Android平台上,合理利用多线程技术可以显著提升应用程序的响应性和用户体验。本文将深入探讨使用Kotlin进行Android多线程编程的策略与实践,旨在为开发者提供系统化的解决方案和性能提升技巧。我们将从基础概念入手,逐步介绍高级特性,并通过实际案例分析如何有效利用Kotlin协程、线程池以及异步任务处理机制来构建一个更加高效的Android应用。
35 4
|
1月前
|
Java
线程池中的空余线程是如何被回收的
线程池中的空余线程是如何被回收的
27 1
|
1月前
|
API 数据库 Android开发
构建高效Android应用:探究Kotlin多线程优化策略
【2月更文挑战第14天】随着移动设备性能的日益强大,用户对应用程序的响应速度和流畅性要求越来越高。在Android开发中,合理利用多线程技术是提升应用性能的关键手段之一。Kotlin作为一种现代的编程语言,其协程特性为开发者提供了更为简洁高效的多线程处理方式。本文将深入探讨使用Kotlin进行Android多线程编程的最佳实践,包括协程的基本概念、优势以及在实际项目中的应用场景和性能优化技巧,旨在帮助开发者构建更加高效稳定的Android应用。
|
15天前
|
Java
深入理解Java并发编程:线程池的应用与优化
【4月更文挑战第3天】 在Java并发编程中,线程池是一种重要的资源管理工具,它能有效地控制和管理线程的数量,提高系统性能。本文将深入探讨Java线程池的工作原理、应用场景以及优化策略,帮助读者更好地理解和应用线程池。
|
22天前
|
存储 算法 Java
【C/C++ 线程池设计思路】 深入探索线程池设计:任务历史记录的高效管理策略
【C/C++ 线程池设计思路】 深入探索线程池设计:任务历史记录的高效管理策略
69 0
|
5天前
|
Java API 调度
安卓多线程和并发处理:提高应用效率
【4月更文挑战第13天】本文探讨了安卓应用中多线程和并发处理的优化方法,包括使用Thread、AsyncTask、Loader、IntentService、JobScheduler、WorkManager以及线程池。此外,还介绍了RxJava和Kotlin协程作为异步编程工具。理解并恰当运用这些技术能提升应用效率,避免UI卡顿,确保良好用户体验。随着安卓技术发展,更高级的异步处理工具将助力开发者构建高性能应用。
|
6天前
|
Java
探秘jstack:解决Java应用线程问题的利器
探秘jstack:解决Java应用线程问题的利器
14 1
探秘jstack:解决Java应用线程问题的利器
|
17天前
|
安全 Java 容器
Java并发编程:实现高效、线程安全的多线程应用
综上所述,Java并发编程需要注意线程安全、可见性、性能等方面的问题。合理使用线程池、同步机制、并发容器等工具,可以实现高效且线程安全的多线程应用。
14 1
|
19天前
|
Java 测试技术 Python
Python开启线程和线程池的方法
Python开启线程和线程池的方法
14 0
Python开启线程和线程池的方法