首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

关于Android工作线程的思考

摘要 在Android开发过程中,我们经常使用工作线程,如AsyncTask和线程池。...在Android中,我们或多或少使用了工作线程,比如Thread,AsyncTask,HandlerThread,甚至是自己创建的线程池,使用工作线程我们可以将耗时的操作从主线程中移走。...然而在Android系统中为什么存在工作线程呢,常用的工作线程有哪些不易察觉的问题呢,关于工作线程有哪些优化的方面呢,本文将一一解答这些问题。...工作线程的存在原因 因为Android的UI单线程模型,所有的UI相关的操作都需要在主线程(UI线程)执行 Android中各大组件的生命周期回调都是位于主线程中,使得主线程的职责更重 如果不使用工作线程为主线程分担耗时的任务...因而,在Android中使用工作线程显得势在必行,如一开始提到那样,在Android工作线程有很多,接下来我们将围绕AsyncTask,HandlerThread等深入研究。

72820

Android 异步操作】线程池 ( 线程池作用 | 线程池种类 | 线程工作机制 | 线程池任务调度源码解析 )

文章目录 一、线程池作用 二、线程池种类 三、线程工作机制 四、线程池任务调度源码解析 一、线程池作用 ---- 线程池作用 : ① 避免创建线程 : 避免每次使用线程时 , 都需要 创建线程对象 ;...---- 线程池种类 : ① newCachedThreadPool : 可缓存线程池 , 如果 线程线程个数已满 , 回收空闲线程 , 如果没有空闲线程 , 此时会创建新线程 ; ② newFixedThreadPool...后到的后执行 ) , LIFO 后入先出 ( 后到的先执行 ) ; 三、线程工作机制 ---- 线程线程相关概念: 线程数 : 线程池的 有 最大线程数 MaxSzie , 核心线程数 CoreSize...; 如果 线程数 小于核心线程数 ( CoreSize ) , 那么创建核心线程 , 执行上述任务 ; 如果 线程数 大于核心线程数 ( CoreSize ) , 小于最大线程数 ( MaxSize...如果当前运行线程数小于核心线程数 , 尝试启动新线程执行该任务, 该任务是线程的第一个任务.

90700
您找到你想要的搜索结果了吗?
是的
没有找到

(一)主线程工作线程的分工

服务器端为了能流畅处理多个客户端链接,一般在某个线程A里面accept新的客户端连接并生成新连接的socket fd,然后将这些新连接的socketfd给另外开的数个工作线程B1、B2、B3、B4,这些工作线程处理这些新连接上的网络...这里我们将线程A称为主线程,B1、B2、B3、B4等称为工作线程工作线程的代码框架一般如下: while (!...线程A接收的新连接,可以根据一定的负载均衡原则将新的socket fd分配给工作线程。...如此反复,也就是说线程A记录了各个工作线程上的socket fd数量,这样可以最大化地来平衡资源,避免一些工作线程“忙死”,另外一些工作线程“闲死”的现象。 3....即使工作线程不满载的情况下,也可以让工作线程做其他的事情。比如现在有四个工作线程,但只有三个连接。那么线程B4就可以在handle_other_thing()做一些其他事情。

2K90

线程池】线程池与工作队列

AWT 和 Swing 就使用这个模型,在这个模型中有一个 GUI 事件线程,导致用户界面发生变化的所有工作都必须在该线程中执行。...因此,Swing 应用程序经常需要额外的工作线程,用于运行时间很长的、同 UI 有关的任务。...每个任务对应一个线程方法和单个后台线程(single-background-thread)方法在某些情形下都工作得非常理想。每个任务一个线程方法在只有少量运行时间很长的任务时工作得十分好。...而只要调度可预见性不是很重要,则单个后台线程方法就工作得十分好,如低优先级后台任务就是这种情况。...我们通常想要的是同一组固定的工作线程相结合的工作队列,它使用 wait() 和 notify() 来通知等待线程新的工作已经到达了。该工作队列通常被实现成具有相关监视器对象的某种链表。

99680

Android线程编程——线程基础

进程与线程 什么是进程? 什么是线程? 为什么要使用多线程?...2.线程的状态 3.创建线程 4.中断 5.安全的终止线程 Android沿用了Java的线程模型,一个Android应用在创建的时候会开启一个线程,我们叫它主线程或者UI线程。...如果我们想要访问网络或者数据库等耗时操作,都会开启子线程去处理,从 Android3.0 开始,系统要求网络访问必须在子线程中进行,否则会抛出异常;也就是为了避免主线程被耗时操作阻塞从而产生 ANR。...线程被创建,还没有调用Start方法,在线程运行之前还有一些基础工作要做。 Runnable 可运行状态。一旦调用start方法,线程就处于 Runnable状态。...线程创建后,调用Thread 的 Start方法,开始进入运行状态,当线程执行 wait 方法后,线程进入等待状态,进入等待状态的线程需要其他线程通知才能返回运行状态。

33030

异步模式之工作线程

定义 让有限的工作线程(Worker Thread)来轮流异步处理无限多的任务。也可以将其归类为分工模式,它的典型实现 就是线程池,也体现了经典设计模式中的享元模式。...例如,海底捞的服务员(线程),轮流处理每位客人的点餐(任务),如果为每位客人都配一名专属的服务员,那 么成本就太高了(对比另一种多线程设计模式:Thread-Per-Message) 注意,不同任务类型应该使用不同的线程池...饥饿 固定大小线程池会有饥饿现象 两个工人是同一个线程池中的两个线程 他们要做的事情是:为客人点餐和到后厨做菜,这是两个阶段的工作 客人点餐:必须先点完餐,等菜做好,上菜,在此期间处理点餐的工人必须等待...上菜宫保鸡丁2 创建多少线程池合适 线程池的大小应根据具体的应用场景和系统需求来确定。以下是一些建议供参考: 考虑系统资源:线程池的大小应该与系统可用的资源相匹配。...考虑任务类型:不同类型的任务对线程池的需求量不同。

12630

Windows线程漫谈界面线程工作线程

大家好,又见面了,我是全栈君 每个系统都有线程,而线程的最重要的作用就是并行处理,提高软件的并发率。针对界面来说,还能提高界面的响应力。...线程分为界面线程工作线程,界面实际就是一个线程画出来的东西,这个线程维护一个“消息队列”,“消息队列”也是界面线程工作线程的最大区别,这个词应该进到你的脑子里,根深蒂固的!...,我们就要注意线程的同步问题了,线程的同步一般来说,是在多个线程共用了资源的时候。...上面已经说了线程的创建、管理(退出线程、等待线程)、同步等,那我们发现了什么共性呢?作为一个程序员,我们要很敏感的发现这些代码上的共性,这是我们设计代码的主要前提。...// 启动线程线程所需要的参数从这里传进 BOOL End(); // 结束线程 virtual void Run(); // 重写Run函数 hovertree.com 所以整个的线程封装成以下的类

57120

Android 异步操作】线程池 ( Worker 简介 | 线程池中的工作流程 runWorker | 从线程池任务队列中获取任务 getTask )

文章目录 一、线程池中的 Worker ( 工作者 ) 二、线程池中的工作流程 runWorker 三、线程池任务队列中获取任务 getTask 在博客 【Android 异步操作】线程池 ( 线程池...(command, true) , 第二个参数为 true 是添加核心线程任务 , 第二个参数为 false 是添加非核心线程任务 ; 拒绝任务 : reject(command) 在上一篇博客 【Android...( 工作者 ) 的相关源码 一、线程池中的 Worker ( 工作者 ) ---- 工作者 Worker 主要 为线程执行任务 , 维护终端控制状态 , 同时记录其它信息 ; 该类扩展了 AbstractQueuedSynchronizer...工作者数量超过线程池个数 线程池停止 线程池关闭 , 任务队列清空 该工作者等待时间超过空闲时间 , 需要被回收 ; 前提是该线程是非和核心线程 ; getTask 相关源码 : /**...该工作者等待时间超过空闲时间 , 需要被回收 ; 前提是该线程是非和核心线程 ; * * @return 返回要执行的任务 ; 如果返回空 , 说明该 工作者 Worker 必须退出

68400

Android线程编程__线程池(ThreadPoolExector)

如果每次执行一个任务都需要开一个新线程去执行,则这些线程的创建和销毁将消耗大量的资源;并且线程都是各自为政,很难对其进行控制,更何况有一堆的线程在执行。这时就需要线程池来对线程进行管理。...线程池的处理流程和原理 提交任务后,线程池先判断线程数时候达到了核心线程数。如果未达到核心线程数,则创建核心线程处理任务;否则,就执行下一步操作。 接着线程池判断任务队列是否满了。...如果线程池中的线程数未达到核心线程数,则创建核心线程处理任务。 如果线程数大于或者等于核心线程数,则将任务加入任务队列,线程池中的空闲线程会不断地从任务队列中取出任务进行处理。...如果任务队列满了,并且线程数没有达到最大线程数,则创建非核心线程去处理。 如果线程数超过了最大线程数,则执行饱和策略。...System.out.println(i); } }; } } SingleThreadExecutor SingThreadExecutor 是使用单个工作线程线程

30140

线程池 execute() 的工作逻辑

最近在看《Java并发编程的艺术》回顾线程池的原理和参数的时候发现一个问题,如果 corePoolSize = 0 且 阻塞队列是无界的。线程池将如何工作?...我们先回顾一下书里面描述线程池execute()工作的逻辑: 如果当前运行的线程,少于corePoolSize,则创建一个新的线程来执行任务。...{ return c & CAPACITY; } // 根据工作线程数和线程池状态获取 ctl private static int ctlOf(int rs, int wc)...如果线程池处于 Running状态,则检查工作线程(worker)是否为0。如果为0,则创建新的线程来处理任务。如果启动线程数大于maximumPoolSize,任务将被拒绝策略拒绝。...线程池将如何工作? 这个问题应该就不难回答了。 最后 《Java并发编程的艺术》是一本学习 java 并发编程的好书,在这里推荐给大家。

1.2K20

线程池是怎样工作

线程池的重点之一就是控制线程资源合理高效的使用,所以必须控制工作线程的个数,所以需要保存当前线程池中工作线程的个数。 看到这里,你是否觉得需要用两个变量来保存线程池的状态和线程池中工作线程的个数呢?...还是跟工作线程的个数有关,每一个线程在取任务的时候,线程池会比较当前的工作线程个数与核心线程数: 如果工作线程数小于当前的核心线程数,则使用第一种方法取任务,也就是没有超时回收,这时所有的工作线程都是“...提交任务的过程也可以拆分成以下几个部分: 当工作线程数小于核心线程数时,直接创建新的核心工作线程工作线程数不小于核心线程数时,就需要尝试将任务添加到阻塞队列中去 如果能够加入成功,说明队列还没有满,...除此之外,会尝试通过 CAS 来自增工作线程的个数,如果自增成功了,则会创建新的工作线程,即 Worker 对象。 然后加锁进行二次验证是否能够创建工作线程,最后如果创建成功,则会启动该工作线程。...3、启动工作线程工作线程创建成功后,也就是 Worker 对象已经创建好了,这时就需要启动该工作线程,让线程开始干活了,Worker 对象中关联着一个 Thread,所以要启动工作线程的话,只要通过

38510

Android-多线程

一:线程相关概念 聊多线程之前,我们先说一说线程,说线程之前,我们了解一下进程。 1.什么是进程?         通俗的说:我们平日里打开的QQ,微信,简书,都是一个进程。...2.那么什么是线程呢?         进程和线程一样,都是实现并发的一个基本单位。线程是比进程更小的执行单位,线程是在进程的基础之上进行进一步的划分。...多线程的实现必须在主线程中创建新的线程对象。任何线程一般具有5种状态,即创建,就绪,运行,阻塞,终止。...就绪:     当我们调用线程的 start() 方法就可以启动线程。当线程启动时,线程进入就绪状态。...总结: join() 方法让一个线程强制运行,线程强制运行期间,其他线程无法运行,必须等待此线程完成之后才可以继续执行。 4.2.线程常用方法之-------sleep(),线程的休眠。

34920

Android 面试必备 - 线程

就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。...(LinkedList list) { this.list = list; } } 生产者与消费者模式在 Handler 中的体现 Android...2、用户线程和守护线程有什么区别? 当我们在Java程序中创建一个线程,它就被称为用户线程。一个守护线程是在后台执行并且不会阻止JVM终止的线程。当没有用户线程在运行的时候,JVM关闭程序并且退出。...一个守护线程创建的子线程依然是守护线程。 3、有哪些不同的线程生命期? 当我们在Java程序中新建一个线程时,它的状态是New。当我们调用线程的start()方法时,状态被改变为Runnable。...它们可以在当前正在执行的线程工作,并避免程序员错误的认为可以在其他非运行线程调用这些方法。 9、 volatile关键字在Java中有什么作用?

48210

android 线程那点事

为了保持较高的响应速度,这就要求主线程中不能执行耗时的任务,这个时候子线程就派上用场了。子线程也叫工作线程,除了主线程以外的线程都是子线程。...Android中的线程 Android沿用了JAVA的线程模型,其中的线程也分为主线程和子线程,其中主线程又叫UI线程。...主线程既要处理Activity组件的UI事件,又要处理Service后台服务工作,通常会忙不过来。为了解决此问题,主线程可以创建多个子线程来处理后台服务工作,而本身专心处理UI画面的事件。...为什么会出现ANR Android希望UI线程能根据用户的要求做出快速响应,如果UI线程花太多时间处理后台的工作,当UI事件发生时,让用户等待时间超过5秒而未处理,Android系统就会给用户显示ANR...一个应用程序中有一个主线程和若干个子线程,而线程的检查工作是由ViewRoot完成的。ViewRoot是什么呢?可以简单的理解为Window和View之前的桥梁或者纽带。

74550

java线程池,工作窃取算法

这边会用“工作者”来代替线程的说法,如果在java中这个工作者就是线程工作窃取核心思想是,自己的活干完了去看看别人有没有没干完的活,如果有就拿过来帮他干。...我们来看一张图,这张图是发生了工作窃取时的状态。 可以看到工作者B的本地队列中没有了需要执行的规则,它正尝试从工作者A的任务队列中偷取一个任务。 为什么说尝试?...Java中的工作窃取算法线程池 在Java 1.7新增了一个ForkJoinPool类,主要是实现了工作窃取算法的线程池,该类在1.8中被优化了,同时1.8在Executors类中还新增了两个newWorkStealingPool...256 使用工作窃取算法的线程池来优化之前的代码 ExecutorService executor = Executors.newWorkStealingPool(8); for (int i =...ForkJoinPool中的工作队列,工作窃取都是需要额外管理的,同时也对线程调度和GC带来了压力。所以ForkJoinPool并不是万能药大家根据具体需要去使用。

85620

java线程池,工作窃取算法

这边会用“工作者”来代替线程的说法,如果在java中这个工作者就是线程工作窃取核心思想是,自己的活干完了去看看别人有没有没干完的活,如果有就拿过来帮他干。...我们来看一张图,这张图是发生了工作窃取时的状态。 可以看到工作者B的本地队列中没有了需要执行的规则,它正尝试从工作者A的任务队列中偷取一个任务。 为什么说尝试?...Java中的工作窃取算法线程池 在Java 1.7新增了一个ForkJoinPool类,主要是实现了工作窃取算法的线程池,该类在1.8中被优化了,同时1.8在Executors类中还新增了两个newWorkStealingPool...256 使用工作窃取算法的线程池来优化之前的代码 ExecutorService executor = Executors.newWorkStealingPool(8); for (int i =...ForkJoinPool中的工作队列,工作窃取都是需要额外管理的,同时也对线程调度和GC带来了压力。 所以ForkJoinPool并不是万能药大家根据具体需要去使用。

69520
领券