导图社区 JAVASE_多线程
程序:一段静态的代码 进程:正在运行的一个程序 线程:进程可进一步细化为线程,是一个程序内部的一条执行路径 说明:线程作为调度和执行的单位,每个线程都拥有独立的运行栈和程序计数器,线程切换开销小。多个线程共享同一个进程中的结构:方法区、堆。
Java SE(Java Standard Edition,Java 标准版)是Java技术的核心和基础,是Java ME和Java EE编程的基础 。
Java反射机制主要提供了以下功能: 1.在运行时判断任意一个对象所属的类。 2.在运行时构造任意一个类的对象。 3.在运行时判断任意一个类所具有的成员变量和方法。 4.在运行时调用任意一个对象的方法。
社区模板帮助中心,点此进入>>
互联网9大思维
安全教育的重要性
组织架构-单商户商城webAPP 思维导图。
个人日常活动安排思维导图
域控上线
西游记主要人物性格分析
17种头脑风暴法
python思维导图
css
CSS
JAVASE_多线程
多线程
顺序执行与并行
实现Runnable接口
继承Thread类不建议使用,避免oop局限性
实现Runnable接口推荐使用,避免单继承局限性,方便同一个对象被多个线程使用
并发问题
如小明老师和黄牛党同时抢10张票,双方都可能抢到第6张票
顺序执行,并行,并发的比较例题
顺序执行:你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。
并发:你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。
交替做不同事情的能力
并行:你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。此处注意理解:是同时吃,同时说,要真严格的说的话,需要2张嘴才是并行。
同时做不同事情的能力
线程状态
线程停止
1.建议线程正常停止--->利用次数,不建议死循环。
2.建议使用标志位--->设置一个标志位
3.不要使用stop或者destroy等过时或者jdk不建议使用的方法
线程休眠sleep()
模拟倒计时
打印系统当前时间
每个对象都有一把锁,sleep不会释放锁
线程礼让yield()
礼让不一定成功,看CPU心情
礼让成功时
礼让不成功时
线程强制执行join()
想像为vip插队的测试
观察线程状态getState()
getState()
线程优先级setPriority(1),getPriority()
先设置优先级再启动
守护线程setDaemon(true)
线程分为用户线程和守护线程,其它都为用户线程
虚拟机必须确保用户线程执行完毕,虚拟机不必确保守护线程执行完毕
如果 JVM 中没有一个正在运行的非守护线程,这个时候,JVM 会退出。换句话说,守护线程拥有自动结束自己生命周期的特性,而非守护线程不具备这个特点。
通常来说,守护线程经常被用来执行一些后台任务,但是呢,你又希望在程序退出时,或者说 JVM 退出时,线程能够自动关闭,此时,守护线程是你的首选。
线程同步
队列+锁
有锁线程安全
线程不安全三大案例
三人共同买票超过了票的数量
两人取钱超过了钱的金额
ArrayList容器添加大量数据时
向容器中添加1000条数据只添加了998条
实现线程同步来实现线程安全
synchronized每个对象对应一把锁,默认锁的是this,锁的对象就是变化的量(增删改的量)
1.使用同步方法
方法中加关键字synchronized
2.使用同步代码块
放进代码块中synchronized(变化的量){}
JUC(并发领域的一些编程)
线程安全类型的一些类
CopyOnWriteArrayList线程安全的集合
死锁
定义
多个线程互相抱着对方的资源,然后形成僵持
产生死锁的四个必要条件
1.互斥条件: 一个资源每次只能被一个进程使用。
2.请求与保持条件: 一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3.不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
上面列出了死锁的四个必要条件,我们只要想办法破其中的任意一个或多个条件就可以避免死锁发生
就是同步时,想拿到另一个线程正在用着的资源时
锁Lock
synchronized与Lock的对比
从jdk5.0开始,ReentrantLock类实现了Lock
1.Lock是显式锁(手动开启和关闭锁,别忘记关闭锁) synchronized是隐式锁, 出了 作用域自动释放
2.Lock只有代码块锁,synchronized有代码块锁和方法锁
使用Lock锁,JVM将花费较少的时间来调度线程,性能更好。并且具有更好的扩展性(提供更多的子类)◆优先使用顺序: ◆Lock >同步代码块(已经进入了方法体,分配了相应资源) >同步方法(在方法体之外)
子主题
线程通信
生成者消费者模式
线程等待wait()/wait(指定等待的毫秒数)
线程唤醒notify()/notfyAll()
测试:
1.生产者消费者模型-->利用缓冲区解决:管程法(利用容器)
生产者
消费者
缓冲区
产品
测试类
结果
信号灯法(利用标志位)
测试
线程池ExecutorService和Executors
利用线程池创建线程