并发编程 -线程、进程、fork-join、wait与notify

线程与线程之间是通过协作来调度的

需要结束一个线程,不推荐使用stop方法,因为该方法不一定会释放该线程所产生的资源回收。
推荐使用interrupt、isinterrupt、isinterrupted来配合使用

线程中共享变量ThreadLocal,用于存放当前线程内所使用的变量
需要注意:

1.使用时需要判断值是否为空,因为采用的弱引用,所以在gc时会被回收
2.使用完必须要remove,否则在gc回收后,该value将不会被获取到,除非再次执行get或set、clear时,才会去清除引用为null的数据。

wait和notify、synchronized使用

wait与notify + synchronized使用,必须在synchronized锁住的对象上才能使用wait/notify,否则会报错
synchronized是非公平锁,即每次执行到synchronized时,当前线程都会先去尝试获取锁,获取到了就立即执行,获取失败就进入等待状态,直到锁释放才会去抢锁。与AQS的实现Sync的实现上会有公平锁与非公平锁的选择。

工作密取

将自己的工作做完之后,将别人的工作拿来完成,做完了再把结果放回去
在fork-join中就使用到,在线程A完成了当前线程的任务,会去线程B拿一个任务来做,做完了再放回去。

fork-join 的使用

主要用于分而治之,将一件大事,分成若干个互不干扰的小事件进行完成,最后通过join来汇总结果

具有返回值的方式(task):
并发编程 -线程、进程、fork-join、wait与notify_第1张图片
不具有返回值(action):
并发编程 -线程、进程、fork-join、wait与notify_第2张图片
countDownLatch的使用

主要用于发令枪,让等待的线程直到countDownLatch的数量扣减完毕之后,await才会被唤醒执行。
扣减数量必须要和预设相等

并发编程 -线程、进程、fork-join、wait与notify_第3张图片
Cyclicbarrier

与countDownLatch不同的是,除了指定数量外,还可以提供一个runnable,在所有线程就绪之后,先执行runnable才会让await的线程进行恢复。调用方法上不同,在调用await的同时就会扣减。而countDownLatch需要调用countDown来扣减。

并发编程 -线程、进程、fork-join、wait与notify_第4张图片
Semaphore

信号量,一般用于限流使用,当达到指定个数之后,需要等待许可归还才能继续使用,一般初始值用于限定流量个数,但是如果在调用acquire前调用了release,那么值就会在初始值上面进行累加,所以,每次调用release都会进行累加一次。这是个坑,需要记住

并发编程 -线程、进程、fork-join、wait与notify_第5张图片
Exchanger

用于对两个线程之间同一种类型的数据进行交换
并发编程 -线程、进程、fork-join、wait与notify_第6张图片

future、futureTask、callable

一般配合使用,用于启动线程,并具有返回值。但是调用task的get方法时,会处于阻塞状态。

你可能感兴趣的:(并发编程,java,并发编程)