转自Android 线程池

public class AppExecutors {    private static final String TAG = "AppExecutors";    /**磁盘IO线程池**/    private final ExecutorService diskIO;/**网络IO线程池**/    private final ExecutorService networkIO;/**UI线程**/    private final Executor mainThread;/**定时任务线程池**/    private final ScheduledExecutorService scheduledExecutor;    private volatile static AppExecutors appExecutors;    public static AppExecutors getInstance() {        if (appExecutors == null) {            synchronized (AppExecutors.class) {                if (appExecutors == null) {                    appExecutors = new AppExecutors();                }            }        }        return appExecutors;    }    public AppExecutors(ExecutorService diskIO, ExecutorService networkIO, Executor mainThread, ScheduledExecutorService scheduledExecutor) {        this.diskIO = diskIO;        this.networkIO = networkIO;        this.mainThread = mainThread;        this.scheduledExecutor = scheduledExecutor;    }    public AppExecutors() {        this(diskIoExecutor(), networkExecutor(), new MainThreadExecutor(), scheduledThreadPoolExecutor());    }/** * 定时(延时)任务线程池 *  * 替代Timer,执行定时任务,延时任务 */    public ScheduledExecutorService scheduledExecutor() {        return scheduledExecutor;    }/** * 磁盘IO线程池(单线程) *  * 和磁盘操作有关的进行使用此线程(如读写数据库,读写文件) * 禁止延迟,避免等待 * 此线程不用考虑同步问题   */    public ExecutorService diskIO() {        return diskIO;    }/** * 网络IO线程池 *  * 网络请求,异步任务等适用此线程 * 不建议在这个线程 sleep 或者 wait   */    public ExecutorService networkIO() {        return networkIO;    }/** * UI线程 *  * Android 的MainThread * UI线程不能做的事情这个都不能做 */    public Executor mainThread() {        return mainThread;    }    private static ScheduledExecutorService scheduledThreadPoolExecutor() {        return new ScheduledThreadPoolExecutor(16, r -> new Thread(r, "scheduled_executor"), (r, executor) -> Log.e(TAG, "rejectedExecution: scheduled executor queue overflow"));    }    private static ExecutorService diskIoExecutor() {        return new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(1024), r -> new Thread(r, "disk_executor"), (r, executor) -> Log.e(TAG, "rejectedExecution: disk io executor queue overflow"));    }    private static ExecutorService networkExecutor() {        return new ThreadPoolExecutor(3, 6, 1000, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(6), r -> new Thread(r, "network_executor"), (r, executor) -> Log.e(TAG, "rejectedExecution: network executor queue overflow"));    }    private static class MainThreadExecutor implements Executor {        private final Handler mainThreadHandler = new Handler(Looper.getMainLooper());        @Override        public void execute(@NonNull Runnable command) {            mainThreadHandler.post(command);        }    }}

用法:

UI线程:

AppExecutors.getInstance().mainThread().execute(new Runnable() {            @Override            public void run() {                //do something            }        });

磁盘IO线程池

AppExecutors.getInstance().diskIO().execute(new Runnable() {            @Override            public void run() {                //do something            }        });

网络IO线程池

AppExecutors.getInstance().networkIO().execute(new Runnable() {            @Override            public void run() {                //do something            }        });

定时(延时)任务线程池

延时3秒后执行:

AppExecutors.getInstance().scheduledExecutor().schedule(new Runnable() {           @Override           public void run() {   // do something           }       },3,TimeUnit.SECONDS);

5秒后启动第一次,每3秒执行一次(第一次开始执行和第二次开始执行之间间隔3秒)

AppExecutors.getInstance().scheduledExecutor().scheduleAtFixedRate(new Runnable() {           @Override           public void run() {   // do something           }       }, 5, 3, TimeUnit.MILLISECONDS);

5秒后启动第一次,每3秒执行一次(第一次执行完成和第二次开始之间间隔3秒)

AppExecutors.getInstance().scheduledExecutor().scheduleWithFixedDelay(new Runnable() {           @Override           public void run() {   // do something           }       }, 5, 3, TimeUnit.MILLISECONDS);

取消 定时(延时)任务

上面3个方法都会有一个如下返回值:

ScheduledFuture<?> scheduledFuture; 

取消定时器(等待当前任务结束后,取消定时器)

scheduledFuture.cancel(false);

取消定时器(不等待当前任务结束,取消定时器)

scheduledFuture.cancel(true);

当然,以上用的都是双重检查(double-check)单例模式。

在我的项目中,没有使用单例模式:
也暂时没有什么问题

/** * Global executor pools for the whole application. * 

* Grouping tasks like this avoids the effects of task starvation (e.g. disk reads don't wait behind * webservice requests). */public class AppExecutors { private final Executor mDiskIO; private final Executor mNetworkIO; private final Executor mMainThread; private final ScheduledThreadPoolExecutor schedule; public AppExecutors() { this.mDiskIO = Executors.newSingleThreadExecutor(); this.mNetworkIO = Executors.newFixedThreadPool(3); this.mMainThread = new MainThreadExecutor(); this.schedule = new ScheduledThreadPoolExecutor(5, new ThreadPoolExecutor.AbortPolicy()); } public Executor diskIO() { return mDiskIO; } public ScheduledThreadPoolExecutor schedule() { return schedule; } public Executor networkIO() { return mNetworkIO; } public Executor mainThread() { return mMainThread; } private static class MainThreadExecutor implements Executor { private Handler mainThreadHandler = new Handler(Looper.getMainLooper()); @Override public void execute(@NonNull Runnable command) { mainThreadHandler.post(command); } }}

优化版(单例模式+线程加名):

public class AppExecutors {    private final Executor mDiskIO;    private final Executor mNetworkIO;    private final Executor mMainThread;    private final ScheduledThreadPoolExecutor schedule;    private static AppExecutors instance;    private static Object object = new Object();    public static AppExecutors getInstance() {        if (instance == null) {            synchronized (object) {                if (instance == null) {                    instance = new AppExecutors();                }            }        }        return instance;    }    private AppExecutors() {        this.mDiskIO = Executors.newSingleThreadExecutor(new MyThreadFactory("single"));        this.mNetworkIO = Executors.newFixedThreadPool(3, new MyThreadFactory("fixed"));        this.mMainThread = new MainThreadExecutor();        this.schedule = new ScheduledThreadPoolExecutor(5, new MyThreadFactory("sc"), new ThreadPoolExecutor.AbortPolicy());    }    class MyThreadFactory implements ThreadFactory {        private final String name;        private int count = 0;        MyThreadFactory(String name) {            this.name = name;        }        @Override        public Thread newThread(@NonNull Runnable r) {            count++;            return new Thread(r, name + "-" + count + "-Thread");        }    }    public Executor diskIO() {        return mDiskIO;    }    public ScheduledThreadPoolExecutor schedule() {        return schedule;    }    public Executor networkIO() {        return mNetworkIO;    }    public Executor mainThread() {        return mMainThread;    }    private static class MainThreadExecutor implements Executor {        private Handler mainThreadHandler = new Handler(Looper.getMainLooper());        @Override        public void execute(@NonNull Runnable command) {            mainThreadHandler.post(command);        }    }}

更多相关文章

  1. android:Handler开启线程定时循环
  2. Android 后台线程调用前台线程的几种方法
  3. Android 创建线程执行任务
  4. android 线程之创建一个子线程,并在UI线程中进行交互
  5. Android studio 多线程网络文件下载
  6. Android 子线程 更新 UI 界面 总结
  7. Android非UI线程访问UI线程的方法总结

随机推荐

  1. Android中用SP(SharedPreferences)保存数据
  2. android RecyclerView获得单个Item的View
  3. 制定2个月学习Android的计划
  4. 解决ListView 下拉时出现黑色阴影
  5. Android内存使用——垃圾回收LOG,GC_CONCU
  6. Android(安卓)Jetpack Components of Roo
  7. android连接数据库sqllist基础操作学习:
  8. 在Android Studio中,如何在app中打开链接
  9. android listview单击事件
  10. android 关闭外音