Semaphore
定义一个Semaphore:Semaphore available = new Semaphore(5, true); //true定义为开始有5个可用的初始同步器
P 原语就相当于 acquire(),V 原语就相当于 release()。
CyclicBarrier
CyclicBarrier 允许一组线程互相等待,直到达到某个公共的障碍点。在涉及一组固定大小的程序中,这些线程必须不时地互相等待,此时是用CyclicBarrier非常好。
当所有线程都调用了 await()后,就表示线程们都可以继续执行了。
CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后
(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作有用。
Runnable runner = new Runnable() {
@Override
public void run() {
//屏障点操作
}
};
CyclicBarrier barrier = new CyclicBarrier(3, runner);
CountDownLatch
用给定的数字作为计数器初始化 CountDownLatch。一个线程调用 await()方法后,在当前计数到达零之前,会一直受阻塞。其他线程调用 countDown() 方法,会使计数器递减,所以,计数器的值为 0 后,会释放所有等待的线程。其他后续的 await 调用都将立即返回。这种现象只出现一次,因为计数无法被重置。如果需要重置计数,请考虑使用 CyclicBarrier。CountDownLatch signal = new CountDownLatch(1);
Exchanger
两个线程互相交换数据,交换对两个线程都是安全的list = (List) ex.exchange(list);
Future, FutureTask
- boolean cancel(boolean mayInterruptIfRunning):试图取消对此任务的执行。如果任务已完成、或已 取消,或者由于某些其他原因而无法取消,则此尝试将失败。当调用 cancel 时,如果调用成功,而此任务尚未启动,则此任务将永不运行。如果任务已经启动,则 mayInterruptIfRunning 参数确定是否应该以试图停止任务的方式来中断执行此任务的线程。
- boolean isCancelled():如果在任务正常完成前将其取消,则返回 true。
- boolean isDone():如果任务已完成,则返回 true。 可能由于正常终止、异常或取消而完成,在所有这些情况中,此方法都将返回 true。
- V get() throws InterruptedException,ExecutionException :如有必要,等待计算完成,然后获取其结果。
- V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException:如有必要,最多等待为使计算完成所给定的时间之后,获取其结果(如果结果可用)。
Callable pAccount = new Callable (){
@Override
Thread.sleep(5000);
return new Random().nextInt(1000);
};
FutureTask futureTask = new FutureTask(pAccount);
Thread pAccountThread = new Thread(futureTask);
pAccountThread.start();
//执行住线程的逻辑
Integer privataAccountMoney = null;
// 如果后台的FutureTask计算完成,则返回计算结果
try {
privataAccountMoney = (Integer) futureTask.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}