zoukankan      html  css  js  c++  java
  • 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很简单的。(主要是我记不住 - -)

  • 相关阅读:
    kaldi的TIMIT实例二
    kaldi的TIMIT实例一
    kaldi脚本注释二
    kaldi脚本注释一
    [转]kaldi特征和模型空间转换
    [转]kaldi中的特征提取
    [转]kaldi上的深度神经网络
    [转]语音识别中区分性训练(Discriminative Training)和最大似然估计(ML)的区别
    [转]kaldi中的在线识别----Online Recognizers
    [转]决策树在Kaldi中如何使用
  • 原文地址:https://www.cnblogs.com/sunfan1988/p/4271883.html
Copyright © 2011-2022 走看看