java.util.concurrent代码总结

结构

ExecutorService

一个线程池管理者,能把Runable、Callable提交到线程池执行。

newFixedThreadPool

可重用的固定大小线程池,以共享的无界队列方式来运行这些线程(只要有请求过来,就会放在队列里等待执行)。如果执行期间某个线程执行失败,一个新线程会代替它执行后续的任务。

newCachedThreadPool

无界线程池,可以自动回收线程(从缓存中移除超过60s没有使用的线程)。

newSingleThreadExecutor

单个线程、无界队列方式运行。可保证按照请求顺序地执行各个任务。

ExecutorService service=Executors.newFixedThreadPool(number);
//提交任务
service.execute();
service.submit();
service.shutdown();

Executor

具体Runnable任务的执行者。

Semaphore

计数信号量。Semaphore通常用来限制可以访问某些资源的线程数目。多于Semaphore的线程进入队列等待资源。

Semaphore position=new Semaphore(number);
//剩余的可访问许可数目,大于0表示可以访问
int remain=position.availablePermits();
//获取访问许可,如果没有remain则阻塞
position.acquire();
//线程释放资源
position.release();
//用来判断所有的线程是否都释放资源,如果有许可没有被释放,则阻塞。等待所有线程释放许可。
position.acquireUninterruptibly(number);
//释放所有许可
position.release(number);

ReentrantLock

可重入的互斥锁。一次只允许一个线程访问资源。

ReentrantLock reentrant=new ReentrantLock();
//获得互斥锁
reentrant.lock();
reentrant.unlock();

Future

表示异步计算的结果,提供了检查计算是否完成的方法。
使用cancel()方法取消任务的执行。
(1)判断任务是否完成
(2)中断任务
(3)获取任务执行的结果

ScheduledExecutorService

延迟或定期执行命令。schedule方法中出现0或者负数延迟,将被视为一种立即执行的请求。

ScheduledExecutorService scheduler=Executors.newScheduledThreadPool(number);
//以固定的周期执行任务,不受任务执行时间的影响,到时间就执行
ScheduledFuture result=scheduler.scheduleAtFixedRate(task,start,T,TimeUnit.SECONDS);
//考虑任务执行时间,上一次执行完延迟delay的时间执行下一次
ScheduledFuture result=scheduler.scheduleWithFixedDelay(task,start,delay,TimeUnit.SECONDS);
//定时执行任务
ScheduledFuture result=scheduler.schedule(task,delay,TimeUnit.SECONDS);
scheduler.shutdown();

CyclicBarrier

提供多个线程之间的同步辅助,使一组线程可以相互等待,直到所有线程都到达公共屏蔽点。CyclicBarrier支持一个可选的Runnable参数,在每个公共屏蔽点调用一次。参与线程调用await()的次数(公共屏蔽点个数)要相同。

CyclicBarrier barrier=new CyclicBarrier(number,task);
//线程等待
barrier.await();

CountDownLatch

用于线程之间同步。在完成其他线程中执行的操作之前,允许阻塞一个或多个线程。CountDownLatch计数达到零之前,await方法会一直阻塞线程。计数无法被重置。

CountDownLatch count=new CountDownLatch(number);
//计数减一
count.countDown();
(1)初始计数为1的CountDownLatch,先在要阻塞的多个线程中调用await(),在控制线程中调用countdown(),控制多个线程继续运行。
(2)初始计数为N的CountDownLatch,先在运行操作的多个线程最后调用countdown(),在控制线程中调用await(),则控制线程会等待所有工作线程结束才继续执行。

Callable

一般情况下,创建线程有两种方式:
(1)继承Thread
(2)实现Runnable接口
这两种方法的共同缺陷是在执行完任务之后无法获取执行结果。
Callable是类似于Runnable接口,实现Callable接口的类和实现Runnable的类都是可被其他线程执行的任务。Callable任务返回一个Future对象。

//调用get方法,当前线程会等待任务执行完毕后才往下执行
future.get();

CompletionService

对完成的任务,按照完成的顺序处理他们的结果。

ExecutorService service=Executors.newCachedThreadPool();
CompletionService<T> completion=new ExecutorCompletionService<T>(service);
for(int i=0;i<10;i++)
{
completion.submit(task);
}
for(int i=0;i<10;i++)
{
//CompletionService提供了两种方法取出结果,take()是阻塞方法,poll()是非阻塞方法。
System.out.println(completion.take().get());
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值