线程池的用法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         });

 

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

posted @ 2015-09-08 22:24  lude313  阅读(328)  评论(3编辑  收藏  举报