多线程
文章平均质量分 81
锐湃
这个作者很懒,什么都没留下…
展开
-
优雅实现网络请求:协程+Flow+Retrofit+OkHttp
使用协程+Flow+Retrofit+OkHttp,我们可以优雅地实现网络请求。我们可以将网络请求抽象为一个数据流,并用一个简单的函数来描述网络请求的过程。这种方法使得代码更加简洁、易读,更易于理解和维护。优雅实现网络请求:协程+Flow+Retrofit+OkHttp。转载 2024-07-05 16:01:56 · 183 阅读 · 0 评论 -
异步编程:Coroutine与RxJava的差异及实例分析
Coroutine是Kotlin标准库的一部分,旨在提供一种轻量级且易用的方式来编写异步代码。与传统的回调方法相比,Coroutine允许开发者以顺序风格编写异步代码,使代码更易读、更易维护。RxJava是一个响应式编程库,允许开发者通过操作符组合异步和事件驱动的程序。它提供了一组强大的操作符,用于处理异步数据流,使得数据处理变得更加灵活和强大。转载 2024-06-12 16:41:09 · 40 阅读 · 0 评论 -
10种Kotlin锁同步技术
多线程编程在 Kotlin 中具有巨大的潜力,可以构建响应迅速、高效的应用程序。然而,随着并发能力的增强,同步访问共享资源以防止数据损坏和竞争条件的挑战也随之而来。在本文中,我们将深入探讨 Kotlin 中的同步世界,探索确保应用程序线程安全和健壮性的最佳实践和技术。同步是协调多个线程对共享资源的访问的过程,以保持数据完整性和一致性。在 Kotlin 中,当涉及到对可变状态(如共享变量、数据结构或关键代码段)的并发访问时,同步至关重要。转载 2024-05-27 19:57:18 · 202 阅读 · 0 评论 -
HandlerThread要记得quit
HandlerThread 属于老生常谈的问题了,它本质上一个自带Loop消息循环的Thread,「就是个线程」有时候我们自己也希望有个类似主线程类似的消息队列帮助我们处理消息,它就是做这个事情的。跟主线程有着异曲同工之妙,唯一的区别就是 主线程loop队列不能退出,它是随时创建随时关闭退出。奥妙就在下面红框的2个代码中,网上文章多如牛毛,这里就不赘述了。转载 2024-02-23 13:58:21 · 132 阅读 · 0 评论 -
Android 中设置线程优先级的正确方式(2种方法)
在 Android 中,有两种常见的设置线程优先级的方式:第一种,使用 Thread 类实例的 setPriority 方法,来设置线程优先级。第二种,使用 Process 类的 setThreadPriority 方法,来设置线程优先级。Java 原生的方法 setPriority 修改线程优先级时,参数范围必须在 MIN_PRIORITY 和 MAX_PRIORITY 范围之间,如果超过该范围,将抛出错误。设置成功时,此线程的优先级将设置为指定的参数和该线程的线程组的最大允许优先级中的较小者。转载 2024-02-19 16:53:48 · 784 阅读 · 0 评论 -
Android 多线程并发优化实现
Android 多线程并发优化实现转载 2024-02-19 16:23:42 · 167 阅读 · 0 评论 -
CountDownLatch的使用场景
下面介绍一下 CountDownLatch 的主要方法。public它的构造函数是传入一个参数,该参数 count 是需要倒数的数值。await():调用 await() 方法的线程开始等待,直到倒数结束,也就是 count 值为 0 的时候才会继续执行。await(long timeout, TimeUnit unit):await() 有一个重载的方法,里面会传入超时参数,这个方法的作用和 await() 类似,但是这里可以设置超时时间,如果超时就不再等待了。转载 2024-02-04 11:15:39 · 397 阅读 · 0 评论 -
困扰两天的 Java 多线程问题,求助 ChatGPT 后瞬间搞定
一个说难不难,说简单竟看不出来是哪里问题的一个bug。是的 可能自己能力和经验尚浅无法识别,下面你们能否用火眼金睛一眼让bug原形毕露(这个问题是忽然暴露出来的,无任何征兆,没人改动过,生产上运行了很长时间,故很奇怪,所以这个间谍看来很会隐藏)转载 2024-02-04 10:58:12 · 38 阅读 · 0 评论 -
java 线程池 释放
Java线程池是Java多线程编程中的一个重要概念,它可以帮助我们管理线程的生命周期并提高程序的性能。在关闭线程池后,我们需要等待线程池中的任务执行完成。这里的Runnable接口表示一个要执行的任务,你可以在run方法中编写具体的任务逻辑。如果在等待任务执行完成的过程中,发现任务还没有执行完成,我们需要停止所有正在执行的任务并释放线程池中的资源。这里的shutdownNow方法将尝试停止所有正在执行的任务,并返回未完成的任务列表。步骤5:停止所有正在执行的任务并释放线程池中的资源。转载 2024-01-17 11:11:22 · 549 阅读 · 0 评论 -
ThreadLocal:你不知道的优化技巧,Android开发者都在用
变量的生命周期与线程的生命周期是一致的。这意味着,如果一个线程一直不结束,那么它所持有的。是一个强大的工具,它可以使得每个线程都拥有自己独立的变量副本,从而避免了线程安全问题。开发中,多线程是一个常见的话题。适用于需要在线程间传递的局部变量,但不适合作为全局变量的替代品。的原理和使用技巧,希望这些知识能够帮助你更好地理解和使用它。方法来设置和获取线程的局部变量。原理及其使用技巧, 帮助你更好的理解和使用。的原理是基于每个线程都有一个独立的。方法时,会将值存储到当前线程的。方法时,会从当前线程的。转载 2024-01-02 13:57:42 · 44 阅读 · 0 评论 -
多线程编程与性能优化
我们深入了解了Android中更高级的多线程编程技术,包括线程池的使用、锁与条件的灵活应用、并发数据结构以及一些性能优化的策略。希望读者能够在实际项目中灵活运用这些知识,构建高效稳定的Android应用。Android 常见热修复方案及原理。转载 2023-12-18 10:54:28 · 190 阅读 · 0 评论 -
Lock的condition的await、signal/signalAll的机制,以及各种队列变化
acquireQueued(node,savedSate)这个在AQS解析过,就是进入同步双向队列,这个方法怎么都要执行,没有拿到锁就park等待,拿到锁就出队返回,这里只看返回true或false,但不重要,这里的判断条件是 && ,只看interruptMode ,中间这步不看,还是清理cancelNode,看最后,是哪样就返回哪样,selfInterrupt()的话,就是interrupt是signal之后执行,这里只是还原用户操作,和AQS那里是一致。,自己就进入condition的等待队列。转载 2023-07-20 10:23:50 · 409 阅读 · 0 评论 -
打印当前运行中的所有线程信息
原文链接:https://blog.csdn.net/u011578734/article/details/127329878。版权声明:本文为CSDN博主「卜大爷」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。在APP运行过程中,用什么方式可以获取当前进行运行的所有线程信息呢?Android打印当前运行中的所有线程信息。转载 2023-07-17 16:30:35 · 581 阅读 · 0 评论 -
性能优化 - 死锁监控与其背后的小知识
我们通过死锁这个例子,去了解了native层Thread的相关方法,同时也了解了如何使用dlsym打开函数符号并调用。作者:Pika链接:https://juejin.cn/post/7159784805293359141来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。转载 2023-07-17 16:27:24 · 174 阅读 · 0 评论 -
Synchronized锁原理和优化
synchronized中文意思是同步,也称之为”同步锁“。synchronized的作用是保证在同一时刻, 被修饰的代码块或方法只会有一个线程执行,以达到保证并发安全的效果。synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。在JDK1.5之前synchronized是一个重量级锁,相对于j.u.c.Lock,它会显得那么笨重,随着Javs SE 1.6对synchronized进行的各种优化后,synchronized并不会显得那么重了。转载 2023-04-21 10:05:59 · 371 阅读 · 0 评论 -
抖音是如何做线程优化的
本文主要介绍了有关线程的几个方面的优化:主线程创建线程耗时优化。线程数收敛优化。线程默认虚拟空间优化。OOM优化。这些不同的优化手段需要根据项目的实际情况进行选择,比如主线程创建线程优化的实现方面比较简单、影响面也比较低,可以优先实施。而线程数收敛需要涉及到字节码插桩、各种对象代理 复杂度会高一些,可以根据当前项目的实际线程数情况再考虑是否需要优化。转载 2023-03-29 10:36:26 · 153 阅读 · 0 评论 -
Kotlin 协程--线程池的7个灵魂拷问
当时偏重于整体原理,对于细节之处并没有过多的着墨,后来在实际的使用过程中遇到了些问题,也引发了一些思考,故记录之。转载 2023-03-21 10:50:36 · 858 阅读 · 0 评论 -
Thread.sleep(0) 有什么用
我们可能经常会用到 Thread.Sleep 函数来吧使线程挂起一段时间。那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题:假设现在是 2008-4-7 12:00:00.000,如果我调用一下 Thread.Sleep(1000) ,在 2008-4-7 12:00:01.000 的时候,这个线程会不会被唤醒?某人的代码中用了一句看似莫明其妙的话:Thread.Sleep(0)。既然是 Sleep 0 毫秒,那么他跟去掉这句代码相比,有啥区别么?转载 2022-11-04 16:31:37 · 64 阅读 · 0 评论 -
页面异步加载优化的几种方案
其实很简单的实现,我们就是仿造 LayoutInflater 那样子线程加载布局,在主线程添加布局嘛。自定义View如下,继承方式实现一个协程作用域,内部实现子线程加载布局,主线程替换占位View。关于自定义协程作用域相关的问题如果不了解的,可以看看我之前的[协程系列文章](https://juejin.cn/post/7121132393922035720。转载 2022-10-12 11:10:44 · 833 阅读 · 0 评论 -
多线程使用不当导致的 OOM
知道事故的原因,我们来总结下方法论。毕竟孔子他老人家说过自省吾身,常思己过,善修其身!上线前严格的代码review习惯,一定要交给back人去看,毕竟自己写的代码自己是看不出问题的,相信每个程序猿都有这个自信;上线记录备注好上一个可回滚的包版本(给自己留一个后路);上线前确认回滚后,业务是否可降级。如果不可降级,一定要严格拉长这次上线的监控周期。上线后持续关注内存增长情况(这部分极容易被忽略,大家对内存的重视度不如CPU使用率);持续关注CPU使用率增长情况https。...转载 2022-07-26 10:09:49 · 464 阅读 · 0 评论 -
Kotlin协程的简单用法(GlobalScope、lifecycleScope、viewModelScope)
协程(Coroutine)协程就像非常轻量级的线程。线程是由系统调度的,线程切换或线程阻塞的开销都比较大。而协程依赖于线程,但是协程挂起时不需要阻塞线程,协程是由开发者控制的。所以协程也像用户态的线程,非常轻量级,一个线程中可以创建任意个协程。协程就像轻量级的线程。线程由系统调度,协程由开发者控制。kotlin协程本质上是对线程池的封装协程通过将线程切换的复杂性封装入库来简化异步编程。程序的逻辑可以在协程中顺序地表达,而底层库会为我们解决其异步性。GlobalScope(不推荐)G.转载 2022-03-10 09:29:55 · 2354 阅读 · 2 评论 -
定时任务线程池ScheduledThreadPoolExecutor的使用
1. ScheduledThreadPoolExecutor介绍ScheduledThreadPoolExecutor继承自ThreadPoolExecutor。它主要用来在给定的延迟之后执行任务,或者定期执行任务。通常使用工厂类Executors来创建。ScheduledThreadPoolExecutor的功能与Timer类似,但比Timer更强大,更灵活,Timer对应的是单个后台线程,而ScheduledThreadPoolExecutor可以在构造函数中指定多个对应的后台线程数。2.Sche转载 2021-09-24 16:37:55 · 2854 阅读 · 0 评论 -
Kotlin 线程同步的 N 种方法
面试的时候经常会被问及多线程同步的问题,例如:“ 现有 Task1、Task2 等多个并行任务,如何等待全部任务执行完成后,开始执行Task3 ?”Kotlin 中有多种实现方式可供选择,本文将所有这些方式做了整理: Thread.join Synchronized ReentrantLock BlockingQueue CountDownLatch CyclicBarrier CAS Future...转载 2021-07-27 09:58:48 · 2683 阅读 · 0 评论 -
happen-before原则
happen-before是JMM最核心的概念,所以在了解happen-before原则之前,首先需要了解java的内存模型。JMM内存模型java内存模型是共享内存的并发模型,线程之间主要通过读-写共享变量来完成隐式通信。java中的共享变量是存储在内存中的,多个线程由其工作内存,其工作方式是将共享内存中的变量拿出来放在工作内存,操作完成后,再将最新的变量放回共享变量,这时其他的线程就可以获取到最新的共享变量。从横向去看看,线程A和线程B就好像通过共享变量在进行隐式通信。这其中有...转载 2021-05-24 16:46:53 · 98 阅读 · 0 评论 -
java多线程-(happen-before原则)
happen-before(生效可见于,并非字面的先行执行)程序顺序规则:一个线程中的每个操作,happens-before于该线程中的任意后续操作。监视器锁规则:解锁happens-before于加锁。volatile变量规则:volatile变量的写,先发生于读,这保证了volatile变量的可见性传递性:A先于B,B先于C,那么A必然先于Cstart规则:线程的start()方法先于它的每一个动作Join规则:如果线程A执行操作ThreadB.join()并成功返回,那么线程B中的...转载 2021-05-21 17:33:08 · 167 阅读 · 0 评论 -
线程切换哪家强?RxJava与Flow的操作符对比
Flow作为Coroutine版的RxJava,同RxJava一样可以方便地进行线程切换。 本文针对两者在多线程场景中的使用区别进行一个简单对比。1. RxJava我们先来回顾一下RxJava中的线程切换如上,RxJava使用subscriberOn与observeOn进行线程切换subscribeOnsubscribeOn用来决定在哪个线程进行订阅,对于Cold流来说即决定了数据的发射线程。使用中有两点注意:当调用链上只有一个subscribeOn时,可以出现在任意位置转载 2021-05-07 10:46:49 · 327 阅读 · 0 评论 -
linux下查看线程信息 /proc/pid/status /proc/pid/task/tid/status文件说明
一、ps查看线程信息 参数说明:-L Show threads, possibly with LWP and NLWP columns-TShow threads, possibly with SPID column-m Show threads after processes,同时显示进程和线程时使用,最经常使用;名词解释:LWP:light weight process,linux下面表示线程;SPID:system process id,linux下面表示...转载 2021-04-10 17:18:16 · 6830 阅读 · 0 评论 -
深入浅出Java线程池:源码篇
前言在上一篇文章深入浅出Java线程池:理论篇中,已经介绍了什么是线程池以及基本的使用。(本来写作的思路是使用篇,但经网友建议后,感觉改为理论篇会更加合适)。本文则深入线程池的源码,主要是介绍ThreadPoolExecutor内部的源码是如何实现的,对ThreadPoolExecutor有一个更加清晰的认识。ThreadPoolExecutor的源码相对而言比较好理解,没有特别难以读懂的地方。相信没有阅读源码习惯的读者,跟着本文,也可以很轻松地读懂ThreadPoolExecutor的核心源码逻辑。转载 2021-04-08 20:21:20 · 107 阅读 · 0 评论 -
深入浅出Java线程池:理论篇
前言很高兴遇见你~借助于很多强大的框架,现在我们已经很少直接去管理线程,框架的内部都会为我们自动维护一个线程池。例如我们使用最多的okHttp以及他的封装框架Retrofit,线程封装框架RxJava和kotlin协程等等。为了更好地使用这些框架,则必须了解他的实现原理,而了解他的原理,线程池是永远绕不开的话题。线程的创建与切换的成本是比较昂贵的。JVM的线程实现使用的是轻量级进程,也就是一个线程对应一个cpu核心。因此在创建与切换线程时,则会涉及到系统调用,是开销比较大的过程。为了解决这个问题,转载 2021-04-08 19:57:51 · 128 阅读 · 0 评论 -
java线程池线程回收
注意: 一定要将线程回收,否则程序会一直等待!! 也可以关闭线程池,来退出程序,但是这样会导致新的任务无法执行!!线程回收之后,有新的任务到来就会自动新建线程。class Task implements Runnable{ private int x; //线程编号 public Task(int x) { this.x = x; } public void run() { System.out.prin...转载 2021-04-01 00:12:02 · 2641 阅读 · 0 评论 -
StackTrace简述以及StackTraceElement使用实例
MainActivity如下:package cc.pp; import android.os.Bundle;import android.app.Activity;/** * Demo描述: * StackTrace简述以及StackTraceElement使用实例 * * * StackTrace简述 * 1 StackTrace用栈的形式保存了方法的调用信息. * 2 怎么获取这些调用信息呢? * 可用Thread.currentThread().getStack转载 2021-03-30 21:09:10 · 2582 阅读 · 0 评论 -
任务调度(三)——Timer的替代品ScheduledExecutorService简介
先前的两篇博文《任务调度(一)——jdk自带的Timer》和《任务调度(二)——jdk自带的Timer 动态修改任务执行计划》中,简单介绍了一下Timer,可以实现几本的功能,但是在多线程方面却略显不足。根据Timer源码,可以看到Timer是单线程的。所以task都是串行执行。假如其中一个task执行需要很长的时间,那其他的task只能干巴巴的等着。怎么办!现在就遇到了这样的问题。总不能因为这个小小的问题就去换别的任务调度框架吧,还是想用最简单的方案去解决一下。所以Sche...转载 2021-02-25 21:37:17 · 562 阅读 · 0 评论 -
synchronized原理
在多线程并发编程中synchronized一直是元老级角色,我们在开发过程中可以使用它来解决线程安全问题中提到的原子性,可见性,以及顺序性。很多人都会称呼它为重量级锁。但是,随着Java SE 1.6对synchronized进行了各种优化之后,有些情况下它就并不那么重了,Java SE 1.6中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,以及锁的存储结构和升级过程。synchronized的三种应用方式: synchronized有三种方式来加锁,分别是:方法锁,对象锁sync转载 2020-11-11 14:21:39 · 187 阅读 · 0 评论 -
java ReadWriteLock用法示例
public class ReadWriteLockTest { public static void main(String[] args) { final Queue3 q3 = new Queue3(); for(int i=0;i<3;i++) { new Thread(){ public void run(){ while(true){转载 2015-06-30 20:45:00 · 436 阅读 · 0 评论 -
java 多线程之Semaphore互斥类的用法
public class SemaphoreTest { public static void main(String[] args) { ExecutorService service = Executors.newCachedThreadPool(); final Semaphore sp = new Semaphore(3); for(int i=0;i<10;i++){转载 2015-06-30 21:04:47 · 583 阅读 · 0 评论 -
java多线程之CyclicBarrier简单用法
public class CyclicBarrierTest { public static void main(String[] args) { ExecutorService service = Executors.newCachedThreadPool(); final CyclicBarrier cb = new CyclicBarrier(3); for(int i=0转载 2015-06-30 21:12:47 · 453 阅读 · 0 评论 -
java多线程之CountdownLatch简单应用
public class CountdownLatchTest { public static void main(String[] args) { ExecutorService service = Executors.newCachedThreadPool(); final CountDownLatch cdOrder = new CountDownLatch(1); fina转载 2015-06-30 21:21:19 · 397 阅读 · 0 评论 -
java 多线之用ReadWriteLock实现 一个简单缓存
public class CacheDemo { private Map cache = new HashMap(); private ReadWriteLock rwl = new ReentrantReadWriteLock(); public Object getData(String key){ rwl.readLock().lock(); Object value转载 2015-06-30 21:27:25 · 395 阅读 · 0 评论 -
java多线程之通过Exchanger线程间传递数据
public class ExchangerTest { public static void main(String[] args) { ExecutorService service = Executors.newCachedThreadPool(); final Exchanger exchanger = new Exchanger(); service.execute(ne转载 2015-06-30 21:32:47 · 713 阅读 · 0 评论 -
java多线程之阻塞队列BlockingQueue的简单应用
public class BlockingQueueTest { public static void main(String[] args) { final BlockingQueue queue = new ArrayBlockingQueue(3); for(int i=0;i<2;i++){ new Thread(){ public void run(){转载 2015-06-30 22:04:17 · 642 阅读 · 0 评论