1.å¦ä½è¿è¡ODEXåç¼è¯å®ä¾
2.硬核干货:4W字从源码上分析JUC线程池ThreadPoolExecutor的实现原理
3.Vert.x 源码解析(4.x)——Context源码解析
å¦ä½è¿è¡ODEXåç¼è¯å®ä¾
0x åè¨
使ç¨å¼æºå·¥å ·åºç°é®é¢èä¸å¾é¾å¨ç½ä¸æ¥æ¾å°è§£å³æ¹æ¡çæ¶åï¼æ好ç解å³æ¹æ³å°±æ¯ç 究å®çæºç ï¼å 为é£æ ·è½ä¸ºæ们æä¾æ´å¤çä¿¡æ¯ã
0x æ建smali/baksmaliæºç è°è¯ç¯å¢
é¦å æ们å¨githubä¸æåsmali/baksmaliçæºç
git clone /JesusFreke/smali.git
å¯ä»¥çåºè¯¥é¡¹ç®éç¨äºgradeèªå¨åæå»ºå·¥å ·æ¥ç¼è¯æºç çï¼å æ¤æ们å¯ä»¥å¨android studioä¸å¯¼å ¥è¯¥é¡¹ç®ï¼å¦ä¸å¾æ示ï¼
çæçbaksmaliå¨å¦ä¸ç®å½ä¸é¢ï¼
ä¸å¾ä¸çProgram argumentsä¸ï¼-aé项代表api levelï¼å¯ä»¥éè¿å¦ä¸å±æ§è·å¾ï¼
æ¥éå¦ä¸ï¼
Error occurred while disassembling classLandroid.support.v4.util.TimeUtils; - skipping class
java.lang.RuntimeException: Invalid methodindex:
atorg.jf.dexlib2.analysis.InlineMethodResolver$InlineMethodResolver_version.resolveExecuteInline(InlineMethodResolver.java:)
atorg.jf.dexlib2.analysis.MethodAnalyzer.analyzeExecuteInline(MethodAnalyzer.java:)
atorg.jf.dexlib2.analysis.MethodAnalyzer.analyzeInstruction(MethodAnalyzer.java:)
atorg.jf.dexlib2.analysis.MethodAnalyzer.analyze(MethodAnalyzer.java:)
atorg.jf.dexlib2.analysis.MethodAnalyzer.<init>(MethodAnalyzer.java:)
atorg.jf.baksmali.Adaptors.MethodDefinition.addAnalyzedInstructionMethodItems(MethodDefinition.java:)
atorg.jf.baksmali.Adaptors.MethodDefinition.getMethodItems(MethodDefinition.java:)
atorg.jf.baksmali.Adaptors.MethodDefinition.writeTo(MethodDefinition.java:)
atorg.jf.baksmali.Adaptors.ClassDefinition.writeDirectMethods(ClassDefinition.java:)
atorg.jf.baksmali.Adaptors.ClassDefinition.writeTo(ClassDefinition.java:)
atorg.jf.baksmali.baksmali.disassembleClass(baksmali.java:)
atorg.jf.baksmali.baksmali.access$(baksmali.java:)
atorg.jf.baksmali.baksmali$1.call(baksmali.java:)
atorg.jf.baksmali.baksmali$1.call(baksmali.java:)
atjava.util.concurrent.FutureTask.run(FutureTask.java:)
atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:)
atjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:)
atjava.lang.Thread.run(Thread.java:)
æ们ç´æ¥éå®åºéçå°æ¹ï¼å¨ä¸é¢åºéä¿¡æ¯æ 红è²çå°æ¹ï¼å¹¶ä¸å¨æåºå¼å¸¸å¤ä¸æç¹ï¼æ们å¯ä»¥å¤æåºéåå æ¯å 为åç¼è¯smaliæ令execute-lineæ¶ä¼ å ¥äºä¸ä¸ªæªç¥çDalvikèææºçå é¨javaæ¹æ³ç´¢å¼inlineIndex=ï¼
ç¶åï¼æ们æinline.txtä½ä¸º-Té项çåæ°ä¼ éè¿å»ï¼
硬核干货:4W字从源码上分析JUC线程池ThreadPoolExecutor的实现原理
深入剖析JUC线程池ThreadPoolExecutor的执行核心 早有计划详尽解读ThreadPoolExecutor的源码,因事务繁忙未能及时整理。在之前的文章中,我们曾提及Doug Lea设计的Executor接口,其顶层方法execute()是线程池扩展的基础。本文将重点关注ThreadPoolExecutor#execute()的brevent源码实现,结合简化示例,逐步解析。 ThreadPoolExecutor的核心功能包括固定的核心线程、额外的非核心线程、任务队列和拒绝策略。它的设计巧妙地运用了JUC同步器框架AbstractQueuedSynchronizer(AQS),以及位操作和CAS技术。网络源码查看工具以核心线程为例,设计上允许它们在任务队列满时阻塞,或者在超时后轮询,而非核心线程则在必要时创建。 创建ThreadPoolExecutor时,我们需要指定核心线程数、最大线程数、任务队列类型等。当核心线程和任务队列满载时,会尝试添加额外线程处理新任务。线程池的状态控制至关重要,通过整型变量ctl进行管理和状态转换,相册管理 网站源码如RUNNING、SHUTDOWN、STOP等,状态控制机制包括工作线程上限数量的位操作。 接下来,我们深入剖析execute()方法。首先,方法会检查线程池状态和工作线程数量,确保在需要时添加新线程。这里涉及一个疑惑:为何需要二次检查?这主要是为了处理任务队列变化和线程池状态切换。任务提交流程中,addWorker()方法负责创建工作线程,spring bean源码解析其内部逻辑复杂,包含线程中断和适配器Worker的创建。 Worker内部类是线程池核心,它继承自AQS,实现Runnable接口。Worker的构造和run()方法共同确保任务的执行,同时处理线程中断和生命周期的终结。getTask()方法是工作线程获取任务的关键,它会检查任务队列状态和线程池大小,确保资源的有效利用。 线程池关闭操作通过shutdown()、shutdownNow()和awaitTermination()方法实现,firefox 网页源码下载它们涉及线程中断、任务队列清理和状态更新等步骤,以确保线程池的有序退出。在这些方法中,可重入锁mainLock和条件变量termination起到了关键作用,保证了线程安全。 ThreadPoolExecutor还提供了钩子方法,允许开发者在特定时刻执行自定义操作。除此之外,它还包含了监控统计、任务队列操作等实用功能,每个功能的实现都是对execute()核心逻辑的扩展和优化。 总的来说,ThreadPoolExecutor的execute()方法是整个线程池的核心,它的实现原理复杂而精细。后续将陆续分析ExecutorService和ScheduledThreadPoolExecutor的源码,深入探讨线程池的扩展和调度机制。敬请关注,期待下文的详细解析。Vert.x 源码解析(4.x)——Context源码解析
Vert.x 4.x 源码深度解析:Context核心概念详解 Vert.x 通过Context这一核心机制,解决了多线程环境下的资源管理和状态维护难题。Context在异步编程中扮演着协调者角色,确保线程安全的资源访问和有序的异步操作。本文将深入剖析Context的源码结构,包括其接口设计、关键实现以及在Vert.x中的具体应用。Context源代码解析
Context接口定义了基础的事件处理功能,如立即执行和阻塞任务。ContextInternal扩展了Context,包含内部方法和功能,通常开发者无需直接接触,如获取当前线程的Context。在vertx的beginDispatch和endDispatch方法中,Context的切换策略取决于线程类型,Vertx线程会使用上下文切换,而非Vertx线程则依赖ThreadLocal。 ContextBase是ContextInternal的实现类,负责执行耗时任务,内部包含TaskQueue来管理任务顺序。WorkerContext和EventLoopContext分别对应工作线程和EventLoop线程的执行策略,它们通过execute()、runOnContext()和emit()方法处理任务,同时监控性能。 Context的创建和获取贯穿于Vert.x的生命周期,它在DeploymentManager的doDeploy方法中被调用,如NetServer和NetClient等组件的底层实现也依赖于Context来处理网络通信。额外说明
Context与线程并非直接绑定,而是根据场景动态管理。部署时创建新Context,非部署时优先获取Thread和ThreadLocal中的Context。当执行异步任务时,当前线程的Context会被暂时替换,任务完成后才恢复。源码中已加入详细注释,如需获取完整注释版本,可联系作者。 Context的重要性在于其在Vert.x的各个层面如服务器部署、EventBus通信中不可或缺,它负责维护线程同步与异步任务的执行顺序,是异步编程中不可或缺的基石。理解Context的实现,有助于更好地利用Vert.x进行高效开发。