• 知识树——线程池


    1 线程池的大小设置
    int N_CPU = Runtime.getRuntime().availableProcessors();
    int U_CPU = 期望的CPU利用率,如0.9;
    int W = 等待时间;
    int C = 计算时间;
    N_THREAD = N_CPU * U_CPU * (1 + W/C)
    (计算密集型时一般使用N_CPU+1 )
     
    2 java.util.concurrent.ThreadPoolExecutor实现
     
    2.1 execute方法
    当工作线程数小于corePoolSize时,创建新的工作线程并执行任务;否则将任务加入到workQueue中。
    将任务加入到workQueue中时,如workQueue已满则创建新的工作线程并执行任务;如果线程数已达maximumPoolSize则创建新线程失败,任务被reject。
     
    2.2 工作线程(Worker)
    获取初始任务或调用getTask方法获取任务,执行任务的run方法,当获取不到任务时线程自然终结。
     
    2.3 getTask方法
    从workQueue中获取任务,如获取不到则等待keepAliveTime的时间。如线程数是否小于等于corePoolSize则无期限等待(可以配置allowCoreThreadTimeOut以改变此行为)。
     
    3 队列比较
     
    3.1 LinkedBlockingQueue
     
    3.2 ArrayBlockingQueue
     
    3.3 PriorityBlockingQueue
    按优先级排序。
     
    3.4 SynchronousQueue
    没有存储功能,总有消费者准备好获取任务时适用。
     
    4 线程池比较
     
    4.1 CachedThreadPool
    无界、SynchronousQueue。
     
    4.2 FixedThreadPool
    corePoolSize==maximumPoolSize、LinkedBlockingQueue。
     
    4.3 ScheduledThreadPool
    定时执行。
     
    4.4 SingleThreadExecutor
    nThreads为1的FixedThreadPool
  • 相关阅读:
    poj2631 Roads in the North(求树的直径)
    P3809 【模板】后缀排序
    P3376 【模板】网络最大流dinic算法
    3224: Tyvj 1728 普通平衡树
    034 Android IntentService 的使用
    033 Android 绑定Service并与之通信
    032 Android Service
    031 Android 异步任务(AsyncTask)
    030 Android 线程+Handler的使用
    029 Android WebView的使用(用来显示网页)
  • 原文地址:https://www.cnblogs.com/chanedi/p/4874438.html
Copyright © 2020-2023  润新知