zoukankan      html  css  js  c++  java
  • 知识树——线程池

    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
  • 相关阅读:
    Android WebView 获取网页的标题
    Android APK 文件自动安装
    DownloadManager 的使用
    Android Java 自定义异常
    Android NDK
    android assets文件夹资源的访问
    GitHub 基本常用知识解答2
    hbuilder egit插件的安装使用--项目文件丢失的教训
    微软收购跨平台移动应用开发商Xamarin
    Android Study 之 初识ButterKnife(8.5.1)及简单运用
  • 原文地址:https://www.cnblogs.com/chanedi/p/4874438.html
Copyright © 2011-2022 走看看