• 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. }






  • 相关阅读:
    window.onload和DOMContentLoaded的区别
    存储
    JSONP的实现原理
    对于一个无线下拉加载图片的页面,如何给每个图片绑定事件
    事件冒泡
    通用的事件绑定函数
    拆解url的各部分
    如何检测浏览器的类型
    DOM节点操作
    es6基本用法
  • 原文地址:https://www.cnblogs.com/sixrain/p/4969075.html
Copyright © 2020-2023  润新知