Java并发编程实践读书笔记(二)

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

  1.  boolean cancel(boolean mayInterruptIfRunning):试图取消对此任务的执行。如果任务已完成、或已   取消,或者由于某些其他原因而无法取消,则此尝试将失败。当调用  cancel  时,如果调用成功,而此任务尚未启动,则此任务将永不运行。如果任务已经启动,则 mayInterruptIfRunning  参数确定是否应该以试图停止任务的方式来中断执行此任务的线程。 
  2. boolean isCancelled():如果在任务正常完成前将其取消,则返回  true。 
  3.  boolean isDone():如果任务已完成,则返回  true。  可能由于正常终止、异常或取消而完成,在所有这些情况中,此方法都将返回  true。 
  4. V get() throws InterruptedException,ExecutionException :如有必要,等待计算完成,然后获取其结果。
  5.  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(); 
    }






你可能感兴趣的:(java,Concurrent)