zoukankan      html  css  js  c++  java
  • 线程池的用法Android

    代码写了一个线程池的Manager,主要用于Android线程管理,并创建了两个线程池,用于请求服务器和访问本地缓存文件。

     1 package com.kevin.threadTest.manager;
     2 
     3 import java.util.concurrent.LinkedBlockingQueue;
     4 import java.util.concurrent.ThreadPoolExecutor;
     5 import java.util.concurrent.TimeUnit;
     6 
     7 /**
     8  * 管理线程池
     9  * 
    10  * @author kevin
    11  * 
    12  */
    13 public class ThreadManager {
    14     private ThreadManager() {
    15 
    16     }
    17 
    18     private static ThreadManager instance = new ThreadManager();
    19     private ThreadPoolProxy longPool;
    20     private ThreadPoolProxy shortPool;
    21 
    22     public static ThreadManager getInstance() {
    23         return instance;
    24     }
    25 
    26     // 联网比较耗时
    27     // cpu的核数*2+1
    28     public synchronized ThreadPoolProxy createLongPool() {
    29         if (longPool == null) {
    30             longPool = new ThreadPoolProxy(5, 5, 5000L);
    31         }
    32         return longPool;
    33     }
    34     // 操作本地文件
    35     public synchronized ThreadPoolProxy createShortPool() {
    36         if(shortPool==null){
    37             shortPool = new ThreadPoolProxy(3, 3, 5000L);
    38         }
    39         return shortPool;
    40     }
    41 
    42     public class ThreadPoolProxy {
    43         private ThreadPoolExecutor pool;
    44         private int corePoolSize;
    45         private int maximumPoolSize;
    46         private long time;
    47 
    48         public ThreadPoolProxy(int corePoolSize, int maximumPoolSize, long time) {
    49             this.corePoolSize = corePoolSize;
    50             this.maximumPoolSize = maximumPoolSize;
    51             this.time = time;
    52 
    53         }
    54         /**
    55          * 执行任务
    56          * @param runnable
    57          */
    58         public void execute(Runnable runnable) {
    59             if (pool == null) {
    60                 // 创建线程池
    61                 /*
    62                  * 1. 线程池里面管理多少个线程2. 如果排队满了, 额外的开的线程数3. 如果线程池没有要执行的任务 存活多久4.
    63                  * 时间的单位 5 如果 线程池里管理的线程都已经用了,剩下的任务 临时存到LinkedBlockingQueue对象中 排队
    64                  */
    65                 pool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize,
    66                         time, TimeUnit.MILLISECONDS,
    67                         new LinkedBlockingQueue<Runnable>(10));
    68             }
    69             pool.execute(runnable); // 调用线程池 执行异步任务
    70         }
    71         /**
    72          * 取消任务
    73          * @param runnable
    74          */
    75         public void cancel(Runnable runnable) {
    76             if (pool != null && !pool.isShutdown() && !pool.isTerminated()) {
    77                 pool.remove(runnable); // 取消异步任务
    78             }
    79         }
    80     }
    81 }

    调用者的代码片段:

     1 // 请求服务器 获取服务器上数据 进行判断
     2         // 请求服务器 返回一个结果
     3         ThreadManager.getInstance().createLongPool().execute(new Runnable() {
     4             
     5             @Override
     6             public void run() {
     7                 SystemClock.sleep(2000);
     8                 final LoadResult result = load();
     9                 UiUtils.runOnUiThread(new Runnable() {
    10 
    11                     @Override
    12                     public void run() {
    13                         if (result != null) {
    14                             state = result.getValue();
    15                             showPage(); // 状态改变了,重新判断当前应该显示哪个界面
    16                         }
    17                     }
    18                 });
    19             }
    20         });

    代码可供初学者参考,也可直接拿去应用到项目中,应用中如有问题,请大家指正。

  • 相关阅读:
    AngularJS Directive 隔离 Scope 数据交互
    Web(Jsp+ Servlet)开发中如何解决中文乱码问题
    MySQL中进行模糊搜索的一些问题
    RequireJS 模块的定义与加载
    Mysql 正则表达式 判断字段值不包含数字
    使用命令行将Excel数据表导入Mysql中的方法小结
    js 去除字符串左右两端的空格
    js 计算两个时间差
    在MySQL中创建实现自增的序列(Sequence)的教程
    ajax post传值
  • 原文地址:https://www.cnblogs.com/lude313/p/4793117.html
Copyright © 2011-2022 走看看