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

2014-11-23 21:35:44 · 作者: · 浏览: 4

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


\



< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGJyPgo8L3A+CjxwPjwvcD4KPGgxPs/fs8zNrLK9PC9oMT4KPGgyPrWxtuC49s/fs8y3w87KzazSu9fK1LTKsaOsvNNzeW5jaHJvbml6ZWS21NfK1LS9+NDQvNPL+DwvaDI+CjxoMj5zeW5jaHJvbml6ZWS/ydLU0N7KzrT6wuu/6aOs0N7Kzre9t6g8L2gyPgo8aDI+1ru21L/J0tS4xLHkvrrV+dfK1LS1xLe9t6i808v4PC9oMj4KPGgyPta709C24M/fs8yyxbvhs/bP1s/fs8ywssirzsrM4jwvaDI+CjxoMj7KzbfFy/i1xMz1vP48L2gyPgo8aDM+zayyvbe9t6ihorT6wuu/6b3hyvg8L2gzPgo8aDM+s/bP1s60tKbA7bXE0uyzozwvaDM+CjxoMz6199PDd2FpdKOsvauxvs/fs8zWw86qvs3Q99e0zKw8L2gzPgo8aDM+c2xlZXC78tXfeWllbGShonN1c3BlbmSyu7vhys23xc2ssr3L+DwvaDM+CjxoMj7NrLK9y/ijqExvY2ujqSzP1Mq+vNPL+KGiys23xcv4PC9oMj4KPGgzPrbB0LTL+KOoUmVhZFdyaXRlTG9ja6OpPC9oMz4KPGgzPr/J1tjI68v4KFJlZW50cmFudExvY2spPC9oMz4KPGg0PrbU0tS808v4tcS8zND4vNPL+DwvaDQ+CjxoND7Dv9K7uPZsb2Nrt723qLa809DSu7j2dW5sb2Nrt723qDwvaDQ+CjxoMj7LwMv4PC9oMj4KPGgzPkG199PDQrXEt723qKGiQrX308NBtcS3vbeoPC9oMz4KPGgzPkHSqrXIQrXEt723qNa00NDN6rLFxNy8zND41rTQ0KOsQtKqtchB1rTQ0M3qssXE3LzM0PjWtNDQPC9oMz4KPGgxPs/fs8zX6TwvaDE+CjxoMj7ErMjPx+m/9s/CuLjP37PMtLS9qNfTz9+zzMG9uPbP37PMvs3U2s2s0rvP37PM1+nPwjwvaDI+CjxoMT5DYWxsYWJsZbrNRnV0dWVyPC9oMT4KPGgyPrT409C3tbvYJiMyMDU0MDu1xA=="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

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