JAVA并发-线程协作

这段时间有点忙,技术博客更新的比较少,今天更新一下相关并发的常用线程协作的类吧。

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很简单的。(主要是我记不住 - -)

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。