首页 > 代码库 > JAVA思维导图系列:多线程中级

JAVA思维导图系列:多线程中级

多线程中级,包含控制线程的几种方法、线程的同步、线程组,有返回值的线程、线程之前的通信、线程池和线程的几个相关类






线程同步

当多个线程访问同一资源时,加synchronized对资源进行加锁

synchronized可以修饰代码块,修饰方法

只对可以改变竞争资源的方法加锁

只有多线程才会出现线程安全问题

释放锁的条件

同步方法、代码块结束

出现未处理的异常

调用wait,将本线程置为就绪状态

sleep或者yieldsuspend不会释放同步锁

同步锁(Lock,显示加锁、释放锁

读写锁(ReadWriteLock

可重入锁(ReentrantLock)

对以加锁的继续加锁

每一个lock方法都有一个unlock方法

死锁

A调用B的方法、B调用A的方法

A要等B的方法执行完才能继续执行,B要等A执行完才能继续执行

线程组

默认情况下父线程创建子线程两个线程就在同一线程组下

CallableFutuer

带有返回值的"run"方法

使用FutureTask接受Callable

使用get阻塞方法得到返回值

控制线程

join

B调用Ajoin,要等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创建线程池

创建RunnableCallable的实例,作为任务类

向线程池提交线程

submit(有返回值)

execute无返回值、方便Exception处理

其他工具类

ThreadLocal

线程局部变量

当前线程作为key,要存的值为value

从线程的角度看,每个线程完全拥有该变量

实例,HibernateFactory生成Session

每个线程独立的改变自己的副本,和其他线程不产生冲突