
Thread详解系列
具体详解线程和线程池
那些年的代码
Java工作者
展开
-
JAVA中Wait()与Notity()、同步队列与等待队列
1.Wait()与Notity()方法wait(): 持有锁的线程调用wait()方法后,会一直阻塞,直到有别的线程调用notify()将其唤醒notify(): 只能通知一个等待线程,唤醒任意一个处于wait线程notifyall():将等待队列中的所有线程唤醒,并加入同步队列同步(线程间的通信) object:wait()与notify()必须搭配synchronized使用,使用wait与notify有一个前提,必须在同步方法或同步代码快中使用,必 须拿到相应对象的锁才能调用...原创 2020-06-28 18:14:08 · 645 阅读 · 0 评论 -
JAVA多线程之线程间的通信方式
一,介绍本总结我对于JAVA多线程中线程之间的通信方式的理解,主要以代码结合文字的方式来讨论线程间的通信,故摘抄了书中的一些示例代码。二,线程间的通信方式①同步这里讲的同步是指多个线程通过synchronized关键字这种方式来实现线程间的通信。参考示例:public class MyObject { synchronized public voi...原创 2020-04-17 08:29:48 · 307 阅读 · 0 评论 -
java主线程等待所有子线程执行完毕再执行
java主线程等待所有子线程执行完毕在执行,这个需求其实我们在工作中经常会用到,比如用户下单一个产品,后台会做一系列的处理,为了提高效率,每个处理都可以用一个线程来执行,所有处理完成了之后才会返回给用户下单成功,下面就说一下我能想到的方法,欢迎大家批评指正:https://blog.youkuaiyun.com/m0_37125796/article/details/81105099...原创 2020-04-16 09:22:11 · 202 阅读 · 0 评论 -
Java多线程---线程间的通信(协作)
在很多情况下,多线程间仅仅同步是不够的,还需要线程与线程协作(通信),生产者/消费者模式是一个经典的线程同步以及通信的模型。 假设有这样一种情况,有一个篮子,篮子里只能放一个鸡蛋,A线程专门往篮子里放鸡蛋,如果篮子里有鸡蛋,则一直等到篮子里没鸡蛋,B线程专门从篮子里取鸡蛋,如果篮子里没鸡蛋,则一直等到篮子里有鸡蛋。这里篮子是一个互斥区,每次放鸡蛋是互斥的,每次取鸡蛋也是互斥的,...原创 2020-04-16 09:02:15 · 189 阅读 · 0 评论 -
(Java)线程的强制运行和线程的休眠
一、线程的强制运行二、线程的休眠一、线程的强制运行在线程操作中,可以使用 join() 方法让一个线程强制运行,线程强制运行期间,其他线程无法运行,必须等待此线程完成之后才可以继续执行class MyThread implements Runnable{//实现 Runnable 接口 public void run(){//覆写 Thread 类中的 run() 方法...原创 2020-04-15 21:34:58 · 248 阅读 · 0 评论 -
Java锁升级过程
一、锁种类偏向锁因为经过HotSpot的作者大量的研究发现,大多数时候是不存在锁竞争的,常常是一个线程多次获得同一个锁,因此如果每次都要竞争锁会增大很多没有必要付出的代价,为了降低获取锁的代价,才引入的偏向锁。轻量级锁轻量级锁考虑的是竞争锁对象的线程不多,而且线程持有锁的时间也不长的情景。因为阻塞线程需要CPU从用户态转到内核态,代价较大,如果刚刚阻塞不久这个锁就被释放了,那这个代...原创 2020-04-15 09:16:05 · 239 阅读 · 0 评论 -
公平锁与非公平锁+效率差异原因
一张图读懂非公平锁与公平锁线程的挂起线程的挂起操作实质上就是线程进入"非可执行"状态下,在这个状态下CPU不会分给线程时间片,进入这个状态可以用来暂停一个线程的运行。 线程挂起后,可以通过重新唤醒线程来使之恢复运行。cpu分配的线程片非常的短、同时也非常珍贵。线程的挂起可以避免资源的浪费。挂起线程的方法?1、废弃的方法thread.suspend():该方法不会释放线程所暂...原创 2020-04-15 08:29:12 · 533 阅读 · 0 评论 -
读懂非公平锁与公平锁
在Java并发编程中,公平锁与非公平锁是很常见的概念,ReentrantLock、ReadWriteLock默认都是非公平模式,非公平锁的效率为何高于公平锁呢?究竟公平与非公平有何区别呢?首先先简单从名字上来理解,公平锁就是保障了多线程下各线程获取锁的顺序,先到的线程优先获取锁,而非公平锁则无法提供这个保障。看到网上很多说法说非公平锁获取锁时各线程的的概率是随机的,这也是一种很不确切的说法。非...原创 2020-04-15 08:23:48 · 174 阅读 · 0 评论 -
什么是死锁和如何解决死锁
如果一组进程中每一个进程都在等待仅由该组进程中的其他进程才能引发的事件,那么该组进程是死锁的。举例来说:有两个进程A和B,A持有资源a等待b资源,B持有资源b等待a资源,两个进程都在等待另一个资源的同时不释放资源,就形成死锁。形成死锁的四个必要条件:(1) 互斥条件:一个资源每次只能被一个进程使用。(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。(3...原创 2020-04-15 08:07:31 · 212 阅读 · 0 评论 -
Java ExecutorService四种线程池及ThreadPoolExecutor机制
一、Java 线程池Java通过Executors提供四种线程池,分别为:1、newCachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。(线程最大并发数不可控制)2、newFixedThreadPool:创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。3、newScheduledT...原创 2020-04-12 08:36:44 · 243 阅读 · 0 评论 -
如何优雅的关闭Java线程池
面试中经常会问到,创建一个线程池需要哪些参数啊,线程池的工作原理啊,却很少会问到线程池如何安全关闭的。也正是因为大家不是很关注这块,即便是工作三四年的人,也会有因为线程池关闭不合理,导致应用无法正常stop的情况,还有出现一些报错的问题。本篇就以ThreadPoolExecutor为例,来介绍下如何优雅的关闭线程池。01 线程中断在介绍线程池关闭之前,先介绍下Thread的i...原创 2020-04-06 08:29:23 · 594 阅读 · 0 评论 -
理解可重入锁的机制
1、听故事把知识掌握了在一个村子里面,有一口井水,水质非常的好,村民们都想打井里的水。这井只有一口,村里的人那么多,所以得出个打水的规则才行。村长绞尽脑汁,最终想出了一个比较合理的方案,咱们来仔细的看看聪明的村长大人的智慧。井边安排一个看井人,维护打水的秩序。打水时,以家庭为单位,哪个家庭任何人先到井边,就可以先打水,而且如果一个家庭占到了打水权,其家人这时候过来打水不用排队。而那些没...原创 2020-04-01 10:18:25 · 382 阅读 · 0 评论 -
lock()与lockInterruptibly()的区别
lock 与 lockInterruptibly比较区别在于:lock 优先考虑获取锁,待获取锁成功后,才响应中断。lockInterruptibly 优先考虑响应中断,而不是响应锁的普通获取或重入获取。详细区别:ReentrantLock.lockInterruptibly允许在等待时由其它线程调用等待线程的Thread.interrupt方法来中断等待线程的等待而直接返回,这时不用获...原创 2020-03-31 17:57:27 · 280 阅读 · 0 评论 -
sleep与 wait区别
它们最大本质的区别是:sleep()不释放同步锁,wait()释放同步锁.还有用法的上的不同是:sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用interreput()来强行打断;wait()可以用notify()直接唤起.sleep和wait的区别还有:1。这两个方法来自不同的类分别是Thread和Object2。最主要是sleep方法没有释放...原创 2020-03-17 16:59:33 · 303 阅读 · 0 评论 -
java线程池ThreadPoolExecutor的keepAliveTime=0时,表示超过core线程数的线程在空闲时立即结束!!!
今天同事突然提出问题说用哪个线程池好,newFixedThreadPool和newCacheThreadPool里选择,说固定大小线程池keepAliveTime=0,线程空闲会立马回收线程从而节约资源,然后另外一个同事说,0是代表永远不回收,我记忆里也是记得0是永久存活,因为网上很多博客啊,资料啊都是说的0表示线程永久存活在空闲的时候。前面那位同事也是从字面上认为的,没有经过验证,觉得-1才是永...原创 2020-01-09 15:53:19 · 811 阅读 · 0 评论 -
ThreadPoolExecutor 线程池Demo
package threadPoolExecutor;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;//自定义线程池public class ThreadPoolEx...原创 2020-01-09 15:14:42 · 230 阅读 · 0 评论 -
Java线程(二):线程同步synchronized和volatile
上篇通过一个简单的例子说明了线程安全与不安全,在例子中不安全的情况下输出的结果恰好是逐个递增的,为什么会产生这样的结果呢,因为建立的Count对象是线程共享的,一个线程改变了其成员变量num值,下一个线程正巧读到了修改后的num,所以会递增输出。 要说明线程同步问题首先要说明Java线程的两个特性,可见性和有序性。多个线程之间是不能直接传递数据交互的,它们之间的交互只能通过共...原创 2019-08-20 10:45:21 · 93 阅读 · 0 评论 -
Java线程(三):线程协作-生产者/消费者模式
上一篇讲述了线程的互斥(同步),但是在很多情况下,仅仅同步是不够的,还需要线程与线程协作(通信),生产者/消费者模式是一个经典的线程同步以及通信的模型。 假设有这样一种情况,有一个盘子,盘子里只能放一个鸡蛋,A线程专门往盘子里放鸡蛋,如果盘子里有鸡蛋,则一直等到盘子里没鸡蛋,B线程专门从盘子里取鸡蛋,如果盘子里没鸡蛋,则一直等到盘子里有鸡蛋。这里盘子是一个互斥区,每次放鸡...原创 2019-08-20 16:15:48 · 118 阅读 · 0 评论 -
Java多线程总结(四)— Timer 和 TimerTask深入分析
1. 基本概念 java.util.Timer:是一个实用工具类,该类用来调度一个线程(schedule a thread),使它可以在将来某一时刻执行。 Java的Timer类可以调度一个任务运行一次,或定期循环运行。 Timer tasks should complete quickly. 即定时器中的操作要尽可能花费短的时间。 java.util.TimerTask:是一个抽象类...原创 2019-09-03 21:47:12 · 627 阅读 · 0 评论 -
Java线程(五):线程池
自JDK5之后,Java推出了一个并发包,java.util.concurrent,在Java开发中,我们接触到了好多池的技术,String类的对象池、Integer的共享池、连接数据库的连接池、Struts1.3的对象池等等,池的最终目的都是节约资源,以更小的开销做更多的事情,从而提高性能。 我们的web项目都是部署在服务器上,浏览器端的每一个request就是一个线程,...原创 2019-09-03 21:47:08 · 107 阅读 · 0 评论 -
Java线程(六):Callable和Future
接着上一篇继续并发包的学习,本篇说明的是Callable和Future,它俩很有意思的,一个产生结果,一个拿到结果。 Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行任务...原创 2019-09-03 21:47:04 · 119 阅读 · 0 评论 -
Java线程(七):锁对象Lock-同步问题更完美的处理方式
Lock是java.util.concurrent.locks包下的接口,Lock实现提供了比使用synchronized方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题,我们拿Java线程(二)中的一个例子简单的实现一下和sychronized一样的效果,代码如下:[java]view plaincopypublicclassLockTest...原创 2019-09-06 10:03:46 · 174 阅读 · 0 评论 -
Java线程(八):Condition-线程通信更高效的方式
上一篇讲述了并发包下的Lock,Lock可以更好的解决线程同步问题,使之更面向对象,并且ReadWriteLock在处理同步时更强大,那么同样,线程间仅仅互斥是不够的,还需要通信,本篇的内容是基于上篇之上,使用Lock如何处理线程通信。 那么引入本篇的主角,Condition,Condition 将 Object 监视器方法(wait、notify 和 notifyAll)...原创 2019-09-06 10:01:48 · 109 阅读 · 0 评论 -
Java线程(一):线程安全与不安全
当我们查看JDK API的时候,总会发现一些类说明写着,线程安全或者线程不安全,比如说StringBuilder中,有这么一句,“将StringBuilder的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用StringBuffer。 ”,那么下面手动创建一个线程不安全的类,然后在多线程中使用这个类,看看有什么效果。 Count.java:[java]v...原创 2019-08-20 16:16:49 · 201 阅读 · 0 评论