![](https://img-blog.csdnimg.cn/20200611154046736.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java多线程
Java多线程详解
筱寒小记
爱编程、爱生活,计算机专业奋进男青年,立志成为时代翻涌的后浪,分享学习之路所思所得,主要方向为计算机视觉算法、机器学习、数据科学等。
展开
-
Java多线程详解(十一)线程池
线程池背景:经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响很大思路:提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毁、实现重复利用。类似生活中的公共交通工具好处:提高响应速度(减少了创建新线程的时间)降低资源消耗(重复利用线程池中线程,不需要每次都创建)便于线程管理package ThreadTest;import java.util.concurrent.ExecutorService;import jav原创 2020-06-11 15:33:52 · 186 阅读 · 1 评论 -
Java多线程详解(十)线程协作——生产者消费者模式
一、什么是线程通信?应用场景:生产者和消费者问题假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中的产品取走消费如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待,直到仓库中的产品被消费者取走为止如果仓库中放有产品,则消费者可以将产品取走消费,否则停止消费并等待,直到仓库中再次放入产品为止二、线程通信-分析这是一个线程同步的问题,生产者和消费者共享同一个资源,并且生产者和消费者之间相互依赖,互为条件对于生产者,没有生产产品之前,要通知消费者等待原创 2020-06-11 15:14:50 · 254 阅读 · 0 评论 -
Java多线程详解(九)Lock锁的使用
Lock(锁)从JDK5.0开始,Java提供了更强大的线程同步机制——通过显式定义同步锁对象来实现同步。同步锁使用Lock对象充当java.util.locks.Lock接口是控制多个线程对共享资源进行访问的工具。锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前应先获得Lock对象ReentrantLock类实现了Lock,它拥有与synchronized相同的并发性和内存语义,在实现线程安全的控制中,比较常用的是ReentranrLock,可原创 2020-06-11 12:05:55 · 1571 阅读 · 0 评论 -
Java多线程详解(八)死锁
死锁多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能运行,而导致两个或者多个线程都在等待对方释放资源,都停止执行的情形。某一个同步块同时拥有“两个以上对象的锁”时,就可能会发生“死锁”的问题。死锁的避免方法产生死锁的四个必要条件:互斥条件:一个资源每次只能被一个进程使用请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系上面列出了死锁原创 2020-06-11 11:39:55 · 172 阅读 · 0 评论 -
Java多线程详解(七)线程同步机制
线程同步现实生活中,我们会遇到“同一个资源,多个人都想使用”的问题,比如,食堂排队打饭,每个人都想吃饭,最天然的解决办法就是排队,一个个来。处理多线程问题时,多个线程访问同一个对象,并且某些线程还想修改这个对象,这是我们就需要用到线程同步。线程同步其实就是一种等待机制,多个需要同时访问此对象的线程进入这个对象的等待池形成队列,等待前面的线程使用完毕,下一个线程再使用。形成条件队列+锁由于统一进程的多个线程共享同一块存储空间,在带来方便的同时,也带来了访问冲突问题,为了保证数据在方法中原创 2020-06-11 11:28:46 · 187 阅读 · 0 评论 -
Java多线程详解(六)守护线程
守护线程线程分为用户线程和守护线程虚拟机必须确保用户线程执行完毕虚拟机不用等待守护线程执行完毕如,后来记录操作日志,监控内存,垃圾回收等package ThreadTest;//测试守护线程public class TestDaemon { public static void main(String[] args) { God god = new God(); User user = new User(); Thread thr原创 2020-06-10 22:57:27 · 139 阅读 · 0 评论 -
Java多线程详解(五)线程休眠|线程礼让|线程强制执行
一、线程休眠 sleeppackage ThreadTest;import java.text.SimpleDateFormat;import java.util.Date;// 模拟时间打表public class TestSleep { public static void main(String[] args) { //获取系统当前时间 Date startTime = new Date(System.currentTimeMillis());原创 2020-06-10 22:22:04 · 498 阅读 · 0 评论 -
Java多线程详解(四)线程停止
首先用两张图讲一下线程状态停止线程不推荐使用JDK提供的stop()、destroy()方法。【已废弃】推荐线程自己停止下来建议使用一个标志位进行终止变量当 flag == false,则终止线程运行package ThreadTest;//测试stop// 1.建议线程正常停止----》利用次数,不建议死循环// 2.建议使用标志位----》设置一个标志位// 3.不要使用stop或者destroy等过时或者JDK不建议使用的方法public class TestStop原创 2020-06-10 21:30:02 · 181 阅读 · 0 评论 -
Java多线程详解(三)由繁入简推导Lambda表达式
为什么要使用Lambda表达式?避免匿名内部类定义过多可以让你的代码看起来很简洁去掉了一堆没有意义的代码,只留下核心的逻辑理解Functional Interface(函数式接口)是学习Java8 lambda表达式的关键所在函数式接口的定义任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口对于函数式接口,我们可以通过lambda表达式来创建接口的对象Lambda表达式的推导(由繁入简,体会lambda表达式的魅力)一、用普通类实现接口packa原创 2020-06-10 20:29:18 · 462 阅读 · 0 评论 -
Java多线程详解(二)静态代理模式
实现静态代理模式:package ThreadTest;//静态代理模式://真实对象和代理对象都要实现同一个接口//代理对象要代理真实角色//好处://代理对象可以做很多真实对象做不了的事情//真实对象专注做自己的事情public class StaticProxy { public static void main(String[] args) { //你要结婚 You you = new You(); WeddingCompan原创 2020-06-10 17:05:15 · 140 阅读 · 0 评论 -
Java多线程详解(一)三种创建线程的方法
一、继承Thread类自定义线程类继承Thread类重写run()方法,编写线程执行体创建线程对象,调用start()方法启动线程package ThreadTest;//创建线程的方式一:继承Thread类,重写run()方法,调用start开启线程//线程开启不一定立即执行,由cpu调度执行public class TestThread extends Thread{ @Override public void run() { // run()方法线程原创 2020-06-10 11:57:21 · 201 阅读 · 0 评论