4.线程池

由于不需要每次处理复杂逻辑耗时操作,比如加载网络并不需要都开启一个新的线程,可以用线程池处理,把线程存起来,用的时候在取出来,在ondestory里去销毁线程,这样就会节省内存
线程池的原理(看看就行):
  1. public class ThreadPool {
  2. int maxCount = 3;
  3. AtomicInteger count =new AtomicInteger(0);// 当前开的线程数 count=0
  4. LinkedList<Runnable> runnables = new LinkedList<Runnable>();
  5. public void execute(Runnable runnable) {
  6. runnables.add(runnable);
  7. if(count.incrementAndGet()<=3){
  8. createThread();// 最大开三个线程
  9. }
  10. }
  11. private void createThread() {
  12. new Thread() {
  13. @Override
  14. public void run() {
  15. super.run();
  16. while (true) {
  17. // 取出来一个异步任务
  18. if (runnables.size() > 0) {
  19. Runnable remove = runnables.remove(0); //在集合中移除第一个对象 返回值正好是移除的对象
  20. if (remove != null) {
  21. remove.run();
  22. }
  23. }else{
  24. // 等待状态 wake();
  25. }
  26. }
  27. }
  28. }.start();
  29. }
  30. }
线程池的用法:在本项目中新建一个类管理线程池,主要用的就是ThreadPoolExecutor这个类
  1. public class ThreadManager {
  2. private ThreadManager() {
  3. }
  4. private static ThreadManager instance = new ThreadManager();
  5. private ThreadPoolProxy longPool;
  6. private ThreadPoolProxy shortPool;
  7. public static ThreadManager getInstance() {
  8. return instance;
  9. }
  10. // 联网比较耗时
  11. // 开启线程数一般是cpu的核数*2+1
  12. public synchronized ThreadPoolProxy createLongPool() {
  13. if (longPool == null) {
  14. longPool = new ThreadPoolProxy(5, 5, 5000L);
  15. }
  16. return longPool;
  17. }
  18. // 操作本地文件
  19. public synchronized ThreadPoolProxy createShortPool() {
  20. if(shortPool==null){
  21. shortPool = new ThreadPoolProxy(3, 3, 5000L);
  22. }
  23. return shortPool;
  24. }
  25. public class ThreadPoolProxy {
  26. private ThreadPoolExecutor pool;
  27. private int corePoolSize;
  28. private int maximumPoolSize;
  29. private long time;
  30. public ThreadPoolProxy(int corePoolSize, int maximumPoolSize, long time) {
  31. this.corePoolSize = corePoolSize;
  32. this.maximumPoolSize = maximumPoolSize;
  33. this.time = time;
  34. }
  35. /**
  36. * 执行任务
  37. * @param runnable
  38. */
  39. public void execute(Runnable runnable) {
  40. if (pool == null) {
  41. // 创建线程池
  42. /*
  43. * 1. 线程池里面管理多少个线程2. 如果排队满了, 额外的开的线程数3. 如果线程池没有要执行的任务 存活多久4.
  44. * 时间的单位 5 如果 线程池里管理的线程都已经用了,剩下的任务 临时存到LinkedBlockingQueue对象中 排队
  45. */
  46. pool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize,
  47. time, TimeUnit.MILLISECONDS,
  48. new LinkedBlockingQueue<Runnable>(10));
  49. }
  50. pool.execute(runnable); // 调用线程池 执行异步任务
  51. }
  52. /**
  53. * 取消任务
  54. * @param runnable
  55. */
  56. public void cancel(Runnable runnable) {
  57. if (pool != null && !pool.isShutdown() && !pool.isTerminated()) {
  58. pool.remove(runnable); // 取消异步任务
  59. }
  60. }
  61. }
  62. }






原文地址:https://www.cnblogs.com/sixrain/p/4969075.html