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

多线程到底用不用在业务代码上???

那你说,这个里面有线程? 是有的!! 比如说Tomcat,虽然不是你写,但是你确实用了。 会由 web 容器中一个线程进行调用。...这个时候,八股文上是怎么说:用线程把串行动作改成并行。 这个场景也是增加了服务 A 吞吐量,但是用线程就是非常正确,没有任何毛病。...或者这样对比起来看更加清晰一点: 定时任务触发时候,在发起远程接口调用之前,没有线程,所以我们可以启用一个线程加快数据处理。...而 Http 调用或者 RPC 调用,框架中本来就已经一个线程了,而且也给你提供了对应性能调优参数配置,那么首先考虑应该是把这个线程充分利用起来。...如果仅仅是因为异步之后可以提升服务响应速度,没有达到串行改并行效果,那么我更加建议使用消息队列。 三、总结 综上所述,是否在业务代码中使用多线程需要根据具体情况决定。

9910

听我一句劝,业务代码中,别用多线程。

: 整个调用链路非常清晰: ,请你告诉我这里面有线程?...这个时候,八股文上是怎么说:用线程把串行动作改成并行。 这个场景也是增加了服务 A 吞吐量,但是用线程就是非常正确,没有任何毛病。 但是你想想,我们最开始这个案例,是这个场景?...我们最开始案例是想要在业务逻辑中增加一个线程,对着一个下游服务就是一顿猛攻,不是所谓串行改并行,而是用更多线程,带来更多串行。 这已经不是一个概念了。...同时这个线程定位,就类似于 web 容器线程定位。 或者这样对比起来看更加清晰一点: 定时任务触发时候,在发起远程接口调用之前,没有线程,所以我们可以启用一个线程加快数据处理。...如果仅仅是因为异步之后可以提升服务响应速度,没有达到串行改并行效果,那么我更加建议使用消息队列。 好了,本文技术部分就到这里啦。

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

2023阿里巴巴面试真题

其实调用outer 线程已经获取了lock 锁,但是不能在 inner 中重复利用已经获取锁资源,这种锁即称之为不可重入可重入就意味着:线程可以进入任何一个已经拥有的锁所同步着代码块。...newSingleThreadExecutor 创建一个单线程线程,它只会用唯一工作线程执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。...在多线程程序中,一个线程必须等待时候,CPU 可以运行其他线程而不是等待,这样就大大提高了程序效率。也就是说允许单个程序创建多个并行执行线程完成各自任务。 19、多线程越多效率越高?...持续交付 – 通过软件创建,测试和批准系统自动,允许频繁发布软件 责任 – 微服务不关注应用程序作为项目。...lambda 允许把函数作为一个方法参数(函数作为参数传递进方法中),使用 Lambda 表达式可以使代码变更加简洁紧凑。

13720

一行 Python 代码实现并行

何不试试 map map 这一小巧精致函数是简捷实现 Python 程序并行关键。map 源于 Lisp 这类函数式编程语言。它可以通过一个序列实现两个函数之间映射。...其结果大致相当于: map 函数一手包办了序列操作、参数传递和结果保存等一系列操作。 为什么这很重要呢?这是因为借助正确库,map 可以轻松实现并行操作。...对于不同工作,通过尝试来找到线程大小最优值是个不错主意。 创建好 Pool 对象后,并行程序便呼之欲出了。...为了更有趣一些,我统计了不同方法、不同线程大小耗时情况。 结果: 很棒结果不是?这一结果也说明了为什么要通过实验确定线程大小。在我机器上当线程大小大于 9 带来收益就十分有限了。...另一个真实例子 生成上千张图片缩略图 这是一个 CPU 密集型任务,并且十分适合进行并行

1K90

由于不知道Java线程bug,某程序员叕被祭天

我们会使用各种技术缓存 创建性能开销较大 对象,比如线程、连接、内存。...由于线程创建比较昂贵,短平快任务一般考虑使用线程处理,而非直接创建线程。 手动声明线程 JDKExecutors工具类定义了很多便捷方法可以快速创建线程。 ?...我们来看他说弊端案例真的这么严重?...newFixedThreadPool 可能 OOM 我们写一段测试代码,初始一个单线程FixedThreadPool,循环1亿次向线程提交任务,每个任务都会创建一个比较大字符串然后休眠一小时:...模拟一下文件批处理,在程序启动后通过一个线程开启死循环逻辑,不断向线程提交任务,任务逻辑是向一个文件中写入大量数据: 可以想象到,这个线程池中2个线程任务是相当重

29820

和学妹深入探讨CountDownLatch和CyclicBarrier设计哲学

串行系统,优化性能首先想到是能否利用多线程并行处理。 系统单线程运行性能 ?...你发现,while循环每次都会创建线程,而创建线程是个性能开销很大操作。最好能复用线程,所以想到使用线程了吧!...毕竟程序员追求是永无止境。 我们已经将两个查询并行了,但这俩查询和check()、save()之间还是串行。...显然,这俩查询操作和对账操作也可以并行,即在执行对账操作时,可以同时去执行下一轮查询: 完全并行运行性能 ? 这到底是怎么做到呢?...你依然可以利用一个计数器解决刚才说难点,计数器初始为2,t1、t2生产完一条数据都将计数器-1。

55530

敖丙带你了解电商流程引擎

创建一个Context 上下文,作为我们调用下游服务返回结果 ?...第二步创建我们流程节点,这相当于就是保存我们整个流程中需要执行下游服务节点,以Map作为保存数据,NodeConf 节点设置参数,自定义请求服务超时时间(因为并行我们是用线程或者通过get设置时间...第三步引擎类,这个也是我们核心类。通过我们添加node节点判断我们哪些流程是需要串行那些是需要并行,通过线程创建线程放入Feature中,达到同步执行效果。...尽可能去采用思想,这里就按大家实际场景去做测试。 ? 第四步执行Call方法,也就是执行我们node节点。 ?...最后当然就是我们测试结果啦,这里我们创建两个节点NodeOne 和NodeTwo 作为模拟真实业务场景节点,通过一个后面的three作为一个group 需要并行执行节点。

56810

写给小白看线程,还有10道面试题

可以把Executors理解成一个工厂类 。Executors可以创建 6 种不同线程类型。...newWorkStealingPool Java 8 新增创建线程方法,创建时如果不设置任何参数,则以当前机器CPU 处理器数作为线程个数,此线程并行处理任务,不能保证执行顺序。...newSingleThreadExecutor 创建一个单线程线程。这个线程只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一线程因为异常结束,那么会有一个线程替代它。...RUNNING:线程初始状态,可以添加待执行任务。 SHUTDOWN:线程处于待关闭状态,不接收新任务仅处理已经接收任务。...在线程池中,同一个线程可以从阻塞队列中不断获取新任务执行,其核心原理在于线程对 Thread 进行了封装,并不是每次执行任务都会调用 Thread.start() 创建新线程,而是让每个线程去执行一个

34120

Java-线程动态修改大小

,当自己任务队列完成了,可以从其他线程队列拿一个任务出来执行 并发 vs并行 并发是指任务提交,并行指任务执行 并发是并行子集 面试题:假如提供一个闹钟服务,订阅这个服务的人特别多,10亿人,怎么优化...processWorkerExit(w, completedAbruptly); } } 线程参数动态 现有的解决方案痛点。...如果是 CPU 密集型可以把核心线程数设置为核心数+1; 如果是包含 IO 操作任务 但是往往一台服务器是部署了多个应用,一个应用也会有多个线程,所以很难配置一个完美的参数 动态更新工作原理是什么...作为任务队列; 这个过程中涉及到面试题有哪些?...问题一:线程创建后里面有线程?如果没有的话,你知道有什么方法对线程进行预热? 答:线程创建后如果没有任务过来,里面是不会有线程

2.4K40

Java初级开发0608面试

用作缓存 与前置/中间库库数据交换时临时存储数据 你们Redis存储时候对象序列? 需要序列。 你们数据是以什么形式存进Redis?...Java提供了线程可以很好地提高性能, 尤其是当程序中需要创建大量生存期很短暂线程时, 更应该考虑使用线程。...与数据库连接类似的是, 线程在系统启动时即创建大量空闲线程, 程序将一个 Runnable 对象或 Callable 对象传给线程, 线程就会启动一个空闲线程执行它们 run()或 call...使用线程执行线程任务步骤如下: 调用 Executors 类静态工厂方法创建一个 ExecutorService 对象, 该对象代表一个线程。...创建 Runnable 实现类或 Callable 实现类实例, 作为线程执行任务。

49310

驾驭Java线程:定制与扩展

一个元素被放入同步队列时,要求必须有一个线程(作为工作者)正在等待使用这个元素。如果线程发现并没有线程在等待,且线程大小没有达到最大时,便会新创建一个线程作为工作者去消费该任务。...2.4 线程工厂 当线程需要创建线程时,就会通过线程工厂创建Thread对象。默认情况下,线程线程工厂会创建简单新线程,如果需要用户可以为线程定制线程工厂。...递归算法并行 现在谈谈一个使用进程重要领域——递归算法并行。在解决实际问题中,递归是一种常见思想,其中常常用到循环。...如果每一次循环都是独立且耗时得,则可以将其并行以提高效率 // 顺序执行void processSequentially(List elements) { for (Element...,且不依赖后续迭代结果,则也可以使用并行方式改写递归过程。

54220

面试题-关于Java线程一篇文章就够了

使用无界队列线程会导致内存飙升? 说说几种常见线程及使用场景?...线程创建与使用 在JDK5版本中增加了内置线程实现ThreadPoolExecutor,同时提供了Executors创建不同类型线程。...newWorkStealingPool:JDK8新增,根据所需并行层次动态创建和关闭线程,通过使用多个队列减少竞争,底层使用ForkJoinPool实现。...优势在于可以充分利用多CPU,把一个任务拆分成多个“小任务”,放到多个处理器核心上并行执行;当多个“小任务”执行完成之后,再将这些执行结果合并起来即可。...除了以上推荐创建线程方法,还可以通过ThreadPoolExecutor构造方法,直接创建线程

1.8K10

多线程学习指南

线程与进程关系,区别及优缺点? 说说并发与并行区别? 为什么要使用多线程呢? 使用多线程可能带来什么问题?(存泄漏、死锁、线程不安全等等) 创建线程有哪几种方式?...内存泄露问题了解? 线程 为什么要用线程? 你会使用线程? 如何创建线程比较好?...(推荐使用 ThreadPoolExecutor 构造函数创建线程) ThreadPoolExecutor 类重要参数了解?ThreadPoolExecutor 饱和策略了解?...CyclicBarrier(循环栅栏)-CyclicBarrier 和 CountDownLatch 非常类似,它也可以实现线程间技术等待,但是它功能比 CountDownLatch 更加复杂和强大...ConcurrentLinkedQueue: 高效并发队列,使用链表实现。可以看做一个线程安全 LinkedList,这是一个非阻塞队列。

33220

看到一个魔改线程,面试素材加一!

这个线程可以通过并行处理(多个线程)提高吞吐量、又要保证一定范围内任务按照严格先后顺序运行。 用我前面的例子,“按某个维度”就是人名,就是富贵和旺财这个维度。 请问你怎么做?...比如我要用线程保证先后顺序,那么它是这样: 只有一个线程线程,它可以保证先后顺序。 但是这玩意有意义? 有点意义,因为它并不占用主线程,但是意义不大,毕竟阉割了重要“多线程”能力。...所以我们怎么在这个场景下把并行能力给提上去呢? 等等,我们好像已经一个可以保证先后顺序线程了。 那么我们把它横向扩容,多搞几个,不就具备了并行能力了吗?...第一个地方是这里: 作为区分任务维度对象,如果是自定义对象,那么一定要重写其 hashCode、equals,以确保可以起到标识作用。...但是,如果你时候你就要实现这样奇怪功能,比如别人给你一个线程,但是到你流程里面出入某种考虑,需要把任务串行,这个时候肯定是不能动别人线程,那么你可以想起 Dubbo 这里有一个现成,比较优雅

51920

深入理解 Linux epoll 机制

这种情况用户态很难有所作为,只能求助内核提供机制协助。因为内核才能及时管理这些事件通知和调度。 我们再梳理下 IO 多路复用需求和原理。...其中原理其实非常朴实:epoll 实现几乎没有做任何无效功。 我们从使用角度切入一步步分析下。 首先,epoll 第一步是创建一个池子。...我们拿到了一个 epollfd ,这个 epollfd 就能唯一代表这个 epoll 。注意,这里又有一个细节:用户可以创建多个 epoll 。...思考 前面我们已经思考了很多知识点,有一些简单有趣知识点,提示给读者朋友,这里只抛砖引玉。 问题:单核 CPU 能实现并行吗? 不行。 问题:单线程能实现高并发可以。...问题:那并发和并行区别是? 一个是时间段内执行情况,一个是时间时刻执行情况。 问题:单线程如何做到高并发? IO 多路复用呗,今天讲 epoll 就是了。

7.3K124

害 其实银行就是一个Java线程

除了上面的情况还会有另一种情况,5个人加班之后,效率提升,很快就把所有的业务做完了,然后银行就没有人办业务了,那么这多出来五个人要一直在银行待着?...谈到线程就会想到技术,其中最核心思想就是把宝贵资源放到一个池子中;每次使用都从里面获取,用完之后又放回池子供其他人使用,有点吃大锅饭意思。...Java线程有以下优点: 线程是稀缺资源,不能频繁创建。 解耦作用;线程创建于执行完全分开,方便维护。 应当将其放入一个池子中,可以给其他任务进行复用。...Executors.newScheduledThreadPool() Executors.newWorkStealingPool(int) java8新增,使用目前机器上可用处理器作为并行级别 以上这些创建线程方法...所以第二种创建线程方式是自己通过 new ThreadPoolExecutor进行创建。 Executors 有那么多创建线程方法,开发中用哪个比较好? 答案:一个都不用。

38220

还有年味文章,ForkJoinPool 大型图文现场

工具类对使用者「目标」虽然一致,但每一个工具类本身都有它独特应用场景,比如: 我会手动创建线程,为什么要使用线程?...作为并行度为例,np 值就是 ?...但这里在竞争锁时候还会判断线程状态,如果是初始状态主动 yield 放弃 CPU 减少竞争;另外,用一个完整 runState 不同位表示状态也体现出更细粒度吧 Q2: synchronized...,可是如果线程没有创建成功,就需要 deregisterWorker做善后工作了 deregisterWorker deregisterWorker 方法接收刚刚创建线程引用和异常作为参数,做善后工作...task(1) 已经是最小粒度了,可以直接 pop 出来执行,获取最终结果;在 Worker1 进行这些 pop 操作同时,为了满足并行度要求也会创建其他Worker,比如 Worker 2,这时

53610

工作两年多,XX 征信 面试,offer已到手

动态代理生成一个被代理对象子类来作为代理。...终止(TERMINATED):表示该线程已经执行完毕。 想获取面试官青睐,还是得说说线程状态流转,可以根据下面这张图描述: ? 10、有用过线程?是怎么用?...有用过, 创建线程有两种方式 ThreadPoolExecutor Executors 使用ThreadPoolExecutor是JDK原生态创建线程,也可以使用Executors工具类创建线程,...newWorkStealingPoo0l:Java 8 新增创建线程方法,创建时如果不设置任何参数,则以当前机器CPU 处理器数作为线程个数,此线程并行处理任务,不能保证执行顺序。...通常不建议使用Executors创建线程,因为该方式中很多参数都已经给你设置好了,所以在使用时候,如果使用不当或者对参数没有认证考察可能会产生很多意想不到问题:比如队列多大,造成OOM等。

39420

Looper.loop()引发惨案 - 掘金

线程已经有任务在执行了,为啥还会拿到该线程执行新任务呢? RxJava为啥不使用OkHttp内部线程配置,只要有任务,都开启非核心线程去执行?...ok,接下来一一解答 首先,第一个,RxJava如何根据目前Io线程,做到并行任务?...其实很简单,在IoScheduler静态内部类CachedWorkerPool中,维护了一个线程队列,每次收到新任务,都会从队列里面取出一个线程去执行任务,如果没有,则创建一个线程,如下:...就达到了并行效果;上面代码release方法中,我们注意到,被回收线程,存活时间为60s,在CachedWorkerPool 构造方法中,会开启一个定时任务,每间隔60s,就会去检查线程队列,如果线程闲置超过...接着,回答第二个问题,线程已经有任务在执行了,为啥还会拿到该线程执行新任务?

38260
领券