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

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

文章目录 一、线程池中 Worker ( 工作者 ) 二、线程池中工作流程 runWorker 三、线程池任务队列中获取任务 getTask 在博客 【Android 异步操作】线程池 ( 线程池...( 工作者 ) 相关源码 一、线程池中 Worker ( 工作者 ) ---- 工作者 Worker 主要 为线程执行任务 , 维护终端控制状态 , 同时记录其它信息 ; 该类扩展了 AbstractQueuedSynchronizer...= null // 该逻辑中线程池任务队列中获取任务 , 然后执行该任务 // 此处一直循环读取线程池任务队列中任务并执行 while (task !...getTask ---- getTask 线程池 任务队列中 获取任务 , 该方法执行 阻塞 或 定时等待 任务 , 具体执行哪个需要根据当前配置情况 ; 这里通过 线程数 判断该线程是 核心线程..., 还是 非核心线程 ; 非核心线程 : 判定条件 : 如果当前执行线程 大于 核心线程数 , 就是非核心线程 获取方法 : 非核心线程 调用 poll 方法任务队列中取任务 线程回收 : 如果超过

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

Windows 7Visual Studio2012下使用GTK

GLib在GNU库通用公共许可(GNU LGPL)下发布。 GLib主要策略是除了数据结构管理功能以外所有的功能都是线程安全。...如果你有两个线程关联系统数据结构,他们必须使用锁来同步他们操作。 其实并没有去刻意要使用这个库,并且所谓跨平台东西配置起来都不是那么容易。...打开项目的属性,切换到VC++ Directory标签页,修改如下两项配置: 在包含目录中加入如下内容: D:\glib2.28.8\include\atk-1.0;D:\glib2.28.8\lib...\include;D:\glib2.28.8\include\glib-2.0;D:\glib2.28.8\include\gtk-2.0;D:\glib2.28.8\include; 在包含库目录中加入如下内容..._attribute__ ((__packed__)),许多代码都会有这个宏,但是vs中并没有这个宏定义,那么可以根据这个宏原定义自己定义一个vs下等效代码如下: #define PACK( __

62810

【原创】Java并发编程系列35 | ScheduledThreadPoolExecutor定时器

,同时在队列中按照执行时间顺序排序,最先执行任务在队头; 确保线程池中有活动线程,如果没有就启动一个。...} } /** * 确保线程池中有线程执行 * 只有两种情况会启动线程: * 1....} } 3.3 执行过程总结 Runable任务封装成ScheduledFutureTask; 任务加入延时队列,同时在队列中按照执行时间顺序排序,最先执行任务在队头; 确保线程池中有活动线程...,如果没有就启动一个; 线程池中活动线程会循环到任务队列中取任务,当队头任务还没到期时,线程阻塞至队头任务到期时间,然后再取任务; 取出任务后执行,因为任务是ScheduledFutureTask类型...执行过程: Runable任务封装成ScheduledFutureTask; 任务加入延时队列,同时在队列中按照执行时间顺序排序,最先执行任务在队头; 确保线程池中有活动线程,如果没有就启动一个;

76510

向高手学习:glib如何来封装跨平台线程

glib 就是这样一个中间层跨平台库,它提供了很多常用封装,线程库只是其中封装之一,这篇文章我们主要来学习一下 glib 是如何来设计跨平台线程库。...不过反过来说,如果我们在日常开发过程中,把自己编写别处借鉴那些好用轮子都积累起来,形成自己“宝库”,这也是一种经验体现、也是一种竞争力。...glib 在解决跨平台同时,也提供了其他很多有用工具箱,例如:事件循环、线程池、同步队列、内存管理等等。 既然它提供功能多,那么必然会导致体积比较大。...但是 glib 层并没有直接把用户层函数直接交给 Linux 操作系统,而是自己提供了 2 个线程代理函数,在调用 pthread_create() 时,根据不同情况,把这2个代理函数之一传递给操作系统...那么,如果 glib没有定义宏 HAVE_SYS_SCHED_GETATTR,那么 Linux 系统中 pthread_create() 接收到就是 glib第一个线程代理函数 g_thread_proxy

98610

java并发编程实战_java解决并发问题

newCachedThreadPool() -缓存型池子,先查看池中有没有以前建立线程,如果有,就 reuse.如果没有,就建一个新线程加入池中-缓存型池子通常用于执行一些生存期很短异步型任务 因此在一些面向连接...workQueue中,按照FIFO原则依次等待执行(线程池中有线程空闲出来后依次将缓冲队列中任务交付给空闲线程执行); 3、如果线程池中线程数量大于等于corePoolSize,且缓冲队列...,线程空闲超过60秒,将会线程池中移除。...由于核心线程数为0,因此每次添加任务,都会先从线程池中找空闲线程,如果没有就会创建一个线程(SynchronousQueue决定,后面会说)来执行新任务,并将该线程加入线程池中...如果不存在可用于立即运行任务线程(即线程池中线程都在工作),则试图把任务加入缓冲队列将会失败,因此会构造一个新线程来处理新添加任务,并将其加入线程池中

74520

Java虚拟机内存区域划分以及作用详解

,JVM关闭而死 线程执行Java方法时,记录其正在执行虚拟机字节码指令地址 线程执行Nativan方法时,计数器记录为空(Undefined) 唯一在Java虚拟机规范中没有规定任何OutOfMemoryError..., 通过这个例子,大概了解一下程序计数器功能。...2、本地方法栈 不知道大家看过源码没有,看过都应该知道,很多算法或者一个功能实现,都被java封装到了本地方法中,程序直接通过调用本地方法就行了,本地方法栈就是用来存放这种方法,实现该功能代码可能是...,如果有,则返回该值引用,如果没有,那么就会将该值加入运行时常量池中。...1、首先运行程序,Demo1_car.java就会变为Demo1_car.class,将Demo1_car.class加入方法区,检查是否字节码文件常量池中是否有常量值,如果有,那么就加入运行时常量池

85100

你竟然都没有弄懂陌陌面试官问Java虚拟机内存?

线程执行Java方法时,记录其正在执行虚拟机字节码指令地址 线程执行Nativan方法时,计数器记录为空(Undefined) 唯一在Java虚拟机规范中没有规定任何OutOfMemoryError..., 通过这个例子,大概了解一下程序计数器功能。...2、本地方法栈 不知道大家看过源码没有,看过都应该知道,很多算法或者一个功能实现,都被java封装到了本地方法中,程序直接通过调用本地方法就行了,本地方法栈就是用来存放这种方法,实现该功能代码可能是...,如果有,则返回该值引用,如果没有,那么就会将该值加入运行时常量池中。...1、首先运行程序,Demo1_car.java就会变为Demo1_car.class,将Demo1_car.class加入方法区,检查是否字节码文件常量池中是否有常量值,如果有,那么就加入运行时常量池

29910

面试官:你说你精通JVM,那你先说说JVM内存划分及其作用吧!

线程执行Nativan方法时,计数器记录为空(Undefined) 唯一在Java虚拟机规范中没有规定任何OutOfMemoryError情况区域 在这其中,很多不理解没关系,我们学过多线程,有两个线程...,其中一个线程可以暂停使用,让其他线程运行,然后等自己获得cpu资源时,又能从暂停地方开始运行,那么为什么能够记住暂停位置,这就依靠了程序计数器, 通过这个例子,大概了解一下程序计数器功能,关于...2、本地方法栈 不知道大家看过源码没有,看过都应该知道,很多算法或者一个功能实现,都被java封装到了本地方法中,程序直接通过调用本地方法就行了,本地方法栈就是用来存放这种方法,实现该功能代码可能是...,如果有,则返回该值引用,如果没有,那么就会将该值加入运行时常量池中。...1、首先运行程序,Demo1_car.java就会变为Demo1_car.class,将Demo1_car.class加入方法区,检查是否字节码文件常量池中是否有常量值,如果有,那么就加入运行时常量池

53700

JavaThreadPoolExecutor

; 在创建了线程池后,默认情况下,线程池中没有任何线程,而是等待有任务到来才创建线程去执行任务,除非调用了prestartAllCoreThreads()或者prestartCoreThread()方法...默认情况下,在创建了线程池后,线程池中线程数为0,当有任务来之后,就会创建一个线程去执行任务,当线程池中线程数目达到corePoolSize后,就会把新加入任务放到缓存队列当中,缓存队列由构造方法中...3)线程执行完1)中任务后,会循环中反复LinkedBlockingQueue获取任务来执行。...2)在线程池完成预热之后(当前线程池中有一个运行线程),将任务加入LinkedBlockingQueue。...3)线程执行完1中任务后,会在一个无限循环中反复LinkedBlockingQueue获取任务来执行。

62320

线程池和队列学习,队列在线程池中使用,什么是队列阻塞,什么是有界队列「建议收藏」

大家可以通过查看源码了解上图组成各个关系。 4,线程核心参数  corePoolSize : 池中核心线程数   maximumPoolSize : 池中允许最大线程数。   ...当队列中有元素后,被阻塞线程会自动被唤醒(不需要我们编写代码去唤醒),也就是始终有个线程在等着这个队列,如果队列中有东西了,被阻塞线程会主动去拿。这样提供了极大方便性。...当时间期限达到时,如果还没有插入成功,则返回false;否则返回true;   poll方法用来队首取元素,如果队列空,则等待一定时间,当时间期限达到时,如果取到,则返回null;否则返回取得元素...1)当线程池中线程数达到corePoolSize后,新任务将在无界队列中等待,因此线程池中线程数不会超过 corePoolSize。...2)在线程池完成预热之后(当前线程池中有一个运行线程),将任务加入Linked- BlockingQueue。

1.9K30

Java 线程 Executor 框架详解与使用

2、在线程池完成预热之后(当前运行线程数等于corePoolSize),将任务加入LinkedBlockingQueue。...使用无界队列作为工作队列会对线程池带来如下影响 1、当线程池中线程数达到corePoolSize后,新任务将在无界队列中等待,因此线程池中线程数不会超过corePoolSize。...2、在线程池完成预热之后(当前线程池中有一个运行线程),将任务加入LinkedBlockingQueue。...调用 execute 将重用以前构造线程(如果线程可用)。如果现有线程没有可用,则创建一个新线程并添加到池中。...2、线程池中线程DelayQueue中获取ScheduledFutureTask,然后执行任务。 下面看看ScheduedThreadPoolExecutor运行过程示意图 ?

1K20

Java多线程线程池技术

线程池本质是池化技术应用,和连接池类似,创建连接与关闭连接属于耗时操作,创建线程与销毁线程也属于重操作,为了提高效率,先提前创建好一批线程,当有需要使用线程线程池取出,用完后放回线程池,这样避免了频繁创建与销毁线程...newFixedThreadPool 线程池中有固定数量线程,且一直存在 适用于高频任务,即线程在大多数时间里都处于工作状态。...(无)关闭线程池 在线程池使用完成之后,我们需要对线程池中资源进行释放操作,这就涉及到关闭功能。我们可以调用线程池对象shutdown()和shutdownNow()方法来关闭线程池。...当有新任务加入时,如果池中有空闲且尚未销毁线程,则将任务交给此线程执行;如果没有可用线程,则创建一个新线程执行任务并添加到池中。...平时我们实现定时调度功能时候,可能更多是使用第三方类库,比如:quartz等。但是对于更底层功能,我们仍然需要了解。

35360

Tomcat 线程

在 Tomcat 中,线程池被用来处理传入 HTTP 请求。当客户端发送请求时,Tomcat 会线程池中获取一个可用线程来处理该请求。...接收请求:当客户端发起请求时,Tomcat 连接器将接收到请求,并将其传递给线程池。 线程池调度:线程池中线程会被调度来处理请求。如果线程池中有空闲线程,将会有一个线程去执行该请求。...如果线程池中没有可用线程,请求将进入等待队列。 请求处理:选中线程会处理请求,包括解析请求、执行相应业务逻辑等。该线程会一直处理请求直到完成。...请求完成:处理完请求后,线程将返回到线程池中,变为可用状态,以供处理下一个请求。 等待队列:如果线程池中没有空闲线程,新到达请求将会进入等待队列。请求按照先到先服务顺序排队等待处理。...这里空闲线程指 最大线程,即如果核心线程为2,最大线程为3,但现在来了3个任务,tomcat线程池会创建一个救急线程来执行第三个任务,并不回加入队列。这个点跟普通线程池不一样。

69830

springboot线程配置使用

大家好,又见面了,我是你们朋友全栈君。 我们都知道,java中有ThreadPoolExecutor提供线程池服务,非常好用。可以有效解决了一些异步业务,提高系统性能。...下面我们来详细看一下配置和使用过程 1、配置线程池 主要使用到 @Configuration @EnableAsync这两个注解,字面上可以看出,前者是自定义配置类,后者是使能线程池。...* 方法名只要在项目中唯一性,可以适当任意取(最好遵循一定规则) * 使用方法:在需要加入线程方法上增加注解@Async("asyncPromiseExecutor")就可以加入线程池异步执行.../ void promiseShareGame(String token); 实现 @Override @Async("asyncPromiseExecutor") //此处方法实现被加入线程池中执行..."); } 注意: 设置加入线程方法不应该有返回值,虽然定义为有返回值程序执行无错误,但是定义为线程方法,上级调用者无需等待处理结果,如果调用者强行等待返回结果,此异步设置将会没有意义

3.1K20

Java 中线程

简单来说,阻塞操作就是: 如果队列为空,那么队头取数据操作会被阻塞,直到队列中有数据才能返回; 如果队列已满,那么队尾插入数据操作会被阻塞,直到队列中有空闲位置并插入数据后,才能返回。...corePoolSize,则创建新线程来执行任务; 如果当前运行线程数等于 corePoolSize,将提交任务加入 LinkedBlockingQueue; 线程执行完线程池中任务后,会反复...corePoolSize,也就是线程池中无运行线程,那么就创建一个新线程来执行任务; 如果当前线程池中有一个运行线程,那么就将提交任务加入 LinkedBlockingQueue; 线程执行完任务后...如果 60 秒内把一个新任务加入到 SynchronousQueue 阻塞队列,这个空闲线程将执行提交新任务; 如果 60 秒内没有新任务,这个空闲线程将被销毁。...线程池中线程 DelayedWorkQueue 中获取 ScheduledFutureTask,然后执行任务。 ------ ScheduledFuture<?

76940

如何优雅使用线程池!!!

、定期执行、单线程、并发数控制等功能,以达到提高线程可管理性。...在创建了线程池后,默认情况下,线程池中没有任何线程,而是等待有任务到来才创建线程去执行任务,除非调用了预创建线程方法,即在没有任务到来之前就创建 corePoolSize 个线程或者 一个线程: 默认情况下...maximumPoolSize:线程池最大线程数,这个参数也是一个非常重要参数,它表示在线程池中最多能创建多少个线程; keepAliveTime:表示线程没有任务执行时最多保持多久时间会终止。...当提交给线程某一个新任务无法直接被线程池中“核心线程”直接处理,又无法加入等待队列,也无法创建新线程执行;又或者线程池已经调用shutdown()方法停止了工作;又或者线程池不是处于正常工作状态...,则将任务加入BlockingQueue 如果无法将任务加入BlockingQueue(队列已满),则创建新线程来处理任务(需要获得全局锁) 如果创建新线程将使当前运行线程超出maxiumPoolSize

1.5K20

九、HikariCP源码分析之ConcurrentBag二

欢迎访问我博客,同步更新: 枫山别院源代码版本2.4.5-SNAPSHOT②检查本地保存连接//②//如果ThreadLocal中有连接的话, 就遍历, 尝试获取//后往前反向遍历是有好处, 因为最后一次使用连接...③准备工作//③//如果没有ThreadLocal中获取到连接, 那么就sharedList连接池中遍历, 获取连接, timeout时间后超时//因为ThreadLocal中保存连接是当前线程使用过...④⑤添加连接任务do {//④//当前连接池中连接数, 在连接池中有可用连接时候, 该值会增加startSeq = synchronizer.currentSequence();for (T bagEntry...在上面一篇文章中,我们举例租车时候,提到过,线程连接是会相互窃取,其实那个窃取不算是真的窃取,因为虽然你本地保存了连接引用,但是连接又不是你创建,其他线程也可以连接池里拿,没有毛病。...,不能再等了,等待线程计数器中把自己减去,直接返回 null 给用户吧,尽力了......

33620

线程池不得不说秘密……

(4)提供更强大功能,延时定时线程池。...3、keepAliveTime(线程存活保持时间)当线程池中线程数大于核心线程数时,线程空闲时间如果超过线程存活时间,那么这个线程就会被销毁,直到线程池中线程数小于等于核心线程数。...7、handler(线程饱和策略):当线程池和队列都满了,再加入线程会执行此策略。...阻塞队列可以保证任务队列中没有任务时阻塞获取任务线程,使得线程进入wait状态,释放cpu资源。 当队列中有任务时才唤醒对应线程队列中取出消息进行执行。 使得在线程不至于一直占用cpu资源。...submit(Runnable task)则是没有返回值,就算获取它返回值也是null。

18010

ThreadPoolExecutor使用

它可以统一管理线程创建、销毁、优化、监控等,在使用线程池时比我们直接使用原始线程类更加方便。既然线程池这么方便,那它到底是怎么实现上述功能呢?...如果没有超过则创建一个新线程执行任务。...如果超过了,那么将当前执行任务添加到线程工作队列中,但在加入之前会先检查工作队列是否已经满了,如果工作队列已经满了,那么此时它会检查线程池中线程是否超过了允许最大数量。...keepAliveTime(线程活动保持时间):当线程池中线程数大于corePoolSize时,用此参数设置空闲线程等待新任务时间。在此时间内如果线程没有接收到新任务,那么当前线程会被销毁。...队列里存储就是将要被执行任务,只是现在已经超过了最大并发数所以队列里任务只能等待线程池中有其它任务执行完后,它才可以执行。

2.1K20
领券