这段时间有点忙,技术博客更新的比较少,今天更新一下相关并发的常用线程协作的类吧。
ExecutorService
线程池,用于创造和复用线程,他有几种模式。
我举一个自定义线程池数量的例子如下
ExecutorService service = Executors.newFixedThreadPool(10);
CountDownLatch
主要用于通知等待线程什么时候能够开始运作。CountDownLatch 一般作为一个线程的内部变量并且通过构造函数传入
在线程内某时间结束后,调用countdown方法就会自动-1,当countdown计数器为0时,等待的线程就能继续运作了
ExecutorService service = Executors.newFixedThreadPool(10); CountDownLatch end = new CountDownLatch(1); service.submit(new ThreadA( end )) end.await();
CyclicBarrier
一般用于设置线程的一个集合点,使用方式同CountDownLatch方法,区别在于这个类的await需要线程等待内部计数器完全结束至0后才会继续工作。
当线程池内的线程较少时,则可能容易死锁。此外次计数器在线程内部可重复使用
CyclicBarrier barrier = new CyclicBarrier(10);
barrier.await();
Semaphore
一般用于设置排队机制,多线程协作时某个方法最多进入X个线程。用法与之前的相似,设置一个最大限制值,但在完成操作后需要手动进行释放。
Semaphore semaphore = new Semaphore(3); semaphore.acquire(); semaphore.release();
Future
此方法用于异步处理一些复杂的操作,直接上例子吧 通过实现Callable接口的call方法进行包装,异步进行处理,然后通过future的get方法进行回调。
public class TestForThread { public int getRes(){ try { Thread.sleep(10*1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } return 1000; } @Test public void fultrueTest() throws InterruptedException, ExecutionException { ExecutorService service = Executors.newFixedThreadPool(10); CountDownLatch end = new CountDownLatch(1); Semaphore semaphore = new Semaphore(3); Future<Integer> f = service.submit(new Callable<Integer>() { @Override public Integer call() throws Exception { // TODO Auto-generated method stub return new TestForThread().getRes(); } }); System.out.println("keep on "); System.out.println("get callable data"); int a; try { a = f.get(15, TimeUnit.SECONDS); System.out.println(a); } catch (TimeoutException e) { // TODO Auto-generated catch block System.out.println("timeout"); } System.out.println("end"); end.await(); } }
Exchanger
这个用于线程之间的交换,比如一个线程读一个线程写,这个类我想了一下可能是为了节省一个Map的空间吧。不需要通过新建一个Map来存放临时数据。
具体事例不给啦,查API很简单的。(主要是我记不住 - -)
时间: 2024-10-26 13:47:18