美文网首页
android 线程池原理

android 线程池原理

作者: 快感的感知 | 来源:发表于2020-06-17 16:40 被阅读0次

android 线程池原理

线程池的好处

1.频繁的创建和销毁线程,会带来性能的问题。线程的创建和销毁都需要时间,当有大量的线程创建和销毁时,那么这些时间的消耗则比较明显,将导致性能上的缺失。
2.线程池方便管理线程,定时执行线程,间隔执行线程。线程池能控制线程的最大并发数量,避免大量抢占资源导致的阻塞现象。

ThreadPoorExecutor构造方法

threadPoolExecutor = new ThreadPoolExecutor(3,5,1, TimeUnit.SECONDS,new LinkedBlockingDeque<Runnable>(128));

 for (int i = 0; i < 30; i++) {
            final int finalI = i;
            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    SystemClock.sleep(2000);
                    Log.e("ThreadPoolExecutor", "rune: " + finalI);
                    Log.e("ThreadPoolExecutor", Thread.currentThread().getName());

                }
            };
            threadPoolExecutor.execute(runnable);
}

第一个参数corePoolSize 线程池中核心线程的数量,第二个参数maximumPoolSize 线程池中最大线程数量,
第三个参数keepAliveTime 非核心线程的超时时长,第四个参数workQueue 线程池中的任务队列。

ThreadPoorExecutor执行任务的顺序

(corePoolSize -> workQueue -> maximumPoolSize)

  1. 当未超过核心线程数时,就直接创建一个核心线程去执行任务。
  2. 当超过核心线程数,就将任务加入到workQueue的任务队列中等待
  3. 当任务队列中任务添满时候,在不超过最大线程数的情况下启动线程去处理任务
  4. 当线程数量超过最大线程数时,RejectedExecutionHandler对象通知调用者

Android中常用几种线程线程池

1 FixedThreadPool

核心线程数和最大线程数相同,一个无限的任务队列,就是说线程池一直有固定的线程数处理务。

  ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
  for (int i = 0; i < 30; i++) {
        final int finalI = i;
        Runnable runnable = new Runnable(){
            @Override
            public void run() {
                SystemClock.sleep(3000);
                Log.e("fixedThreadPool", "run: "+ finalI);
                Log.e("fixedThreadPool", Thread.currentThread().getName());

            }
        };
   fixedThreadPool.execute(runnable);

2 CachedThreadPool

没有核心线程,最大线程数为2^31-1,线程空闲60秒后被回收,任务队列SynchronousQueue是一个不存储的,所以这个线程的特点是只要任务一来,马上就有线程去执行。

  ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
   for (int i = 0; i < 30; i++) {
       final int finalI = i;
       Runnable runnable = new Runnable(){
           @Override
           public void run() {
               SystemClock.sleep(2000);
               Log.e("cachedThreadPool", "run: "+ finalI);
               Log.e("cachedThreadPool", Thread.currentThread().getName());                }
       };
   cachedThreadPool.execute(runnable);
  SystemClock.sleep(1000);

3 SingleThreadPool

线程池中只有一个核心线程,按顺序执行队列中的任务

   public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }

4 ScheduledThreadPool

该线程最大的特点就可以延迟执行

//第一次延迟initialDelay秒,以后每次延迟delay秒执行一个任务
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(3);
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                Log.d("google_lenve_fb", "run: ----");
            }
        };
scheduledExecutorService.scheduleWithFixedDelay(runnable, 1, 1, TimeUnit.SECONDS);

线程池其他常用功能

1.shutDown() 关闭线程池,不影响已经提交的任务

2.shutDownNow() 关闭线程池,并尝试去终止正在执行的线程

3.allowCoreThreadTimeOut(boolean value) 允许核心线程闲置超时时被回收

4.submit 一般情况下我们使用execute来提交任务,但是有时候可能也会用到submit,使用submit的好处是submit有返回值

相关文章

  • Android 多线程:线程池理解和使用总结

    一、Android线程池介绍 1.1 原理 Android中的线程池概念来源于Java中的Executor,Exe...

  • Android | 线程池的使用和简单原理

    参考文献: Android 多线程: 完全解析线程池ThreadPool原理&使用 Android开发——Andr...

  • 线程+线程池+使用

    Android 多线程: 完全解析线程池ThreadPool原理&使用https://blog.csdn.net/...

  • 面试题2019年7月

    线程池原理 参考:Java 线程池原理分析 线程池工作原理:1、线程数量小于 corePoolSize,直接创建新...

  • android 线程池原理

    android 线程池原理 线程池的好处 1.频繁的创建和销毁线程,会带来性能的问题。线程的创建和销毁都需要时间,...

  • Android进阶-线程池

    在上一篇文章(为什么要学习) AsyncTask 原理 提到了线程池,那么现在来学习学习 Android 的线程池...

  • Android 线程池原理

    线程池核心类 : ThreadPoolExecutor:提供了一系列参数来配置线程池 线程池优点: 1.重用线程池...

  • 线程池创建和相关知识

    线程池创建(单例):Android线程池得要这么用 - 简书 线程池相关知识:Android开发之线程池使用总结 ...

  • 源码分析AsyncTask的工作原理

    一、AsyncTask原理介绍 AsyncTask的实现原理 = 线程池+ Handler 其中:线程池用于线程调...

  • 线程池与Android的日日夜夜

    线程池与Android的日日夜夜 假如你Java中研究到了线程池的话,一般来说,你已经对线程的原理颇有研究了,或者...

网友评论

      本文标题:android 线程池原理

      本文链接:https://www.haomeiwen.com/subject/lamsxktx.html