首页 > 代码库 > JAVA思维导图系列:多线程中级
JAVA思维导图系列:多线程中级
多线程中级,包含控制线程的几种方法、线程的同步、线程组,有返回值的线程、线程之前的通信、线程池和线程的几个相关类
线程同步
当多个线程访问同一资源时,加synchronized对资源进行加锁
synchronized可以修饰代码块,修饰方法
只对可以改变竞争资源的方法加锁
只有多线程才会出现线程安全问题
释放锁的条件
同步方法、代码块结束
出现未处理的异常
调用wait,将本线程置为就绪状态
sleep或者yield、suspend不会释放同步锁
同步锁(Lock),显示加锁、释放锁
读写锁(ReadWriteLock)
可重入锁(ReentrantLock)
对以加锁的继续加锁
每一个lock方法都有一个unlock方法
死锁
A调用B的方法、B调用A的方法
A要等B的方法执行完才能继续执行,B要等A执行完才能继续执行
线程组
默认情况下父线程创建子线程两个线程就在同一线程组下
Callable和Futuer
带有返回值的"run"方法
使用FutureTask接受Callable
使用get阻塞方法得到返回值
控制线程
join
B调用A的join,要等A执行完毕B才执行
也就是说B的线程会阻塞
可以在构造函数里面传最大阻塞时间
守护进程
任务是给其他线程提供服务
当前台进程死亡,守护进程自动死亡
例:JAVA垃圾回收线程
setDaemo设置
线程睡眠
主动进入阻塞状态,调用Sleep方法
JDK5以后推荐同TimeUtil类睡眠
线程让步
执行yield方法,让当前线程设置为就绪状态
当在完成一个方法最重要的功能时候,可以将处理器控制权让出去
不保证让出去后有马上得到处理器控制权
改变线程的优先级
setPriority 范围为1-10
推荐使用Thread的三个静态常量,适合不同操作系统
线程通信
协调运行的控制策略
synchronized
wait
释放当前线程的锁定
例:如果消费完了,等待生产者线程将其唤醒
notify
唤醒当前等待的线程
lock
使用Condition代替同步监视功能
lock.newCondition
await 代替 wait
signal代替
管道流通信
使用new分别创建管道输入流(PipedRead)和输出流(PipedRead)
使用管道输入流或管道的输出流将对象用connent连接起来
将输入输出流分别传入两个线程
分别依赖各自的管道输入流、管道输出流进行通信
两个线程分别依赖自己的管道流进行通信
线程池
用Executors创建线程池
创建Runnable或Callable的实例,作为任务类
向线程池提交线程
submit(有返回值)
execute无返回值、方便Exception处理
其他工具类
ThreadLocal
线程局部变量
当前线程作为key,要存的值为value
从线程的角度看,每个线程完全拥有该变量
实例,HibernateFactory生成Session
每个线程独立的改变自己的副本,和其他线程不产生冲突
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。