Most visited

Recently visited

Added in API level 21

ForkJoinPool.ManagedBlocker

public static interface ForkJoinPool.ManagedBlocker

java.util.concurrent.ForkJoinPool.ManagedBlocker


用于扩展在 ForkJoinPool运行的任务的管理并行性的接口。

A ManagedBlocker提供了两种方法。 如果不需要阻塞,方法isReleasable()必须返回true 方法block()根据需要阻止当前线程(可能在实际阻止之前内部调用isReleasable )。 这些操作由调用managedBlock(ManagedBlocker)的任何线程执行。 这个API中不寻常的方法适用于可能但通常不会长时间阻塞的同步器。 同样,它们可以更有效地处理那些可能需要额外工作人员的情况,但通常不需要确保足够的并行性。 为此,方法isReleasable实现必须适合重复调用。

例如,下面是基于ReentrantLock的ManagedBlocker:

 class ManagedLocker implements ManagedBlocker {
   final ReentrantLock lock;
   boolean hasLock = false;
   ManagedLocker(ReentrantLock lock) { this.lock = lock; }
   public boolean block() {
     if (!hasLock)
       lock.lock();
     return true;
   }
   public boolean isReleasable() {
     return hasLock || (hasLock = lock.tryLock());
   }
 }

这是一个可能阻止等待给定队列中的项目的类:

 class QueueTaker<E> implements ManagedBlocker {
   final BlockingQueue<E> queue;
   volatile E item = null;
   QueueTaker(BlockingQueue<E> q) { this.queue = q; }
   public boolean block() throws InterruptedException {
     if (item == null)
       item = queue.take();
     return true;
   }
   public boolean isReleasable() {
     return item != null || (item = queue.poll()) != null;
   }
   public E getItem() { // call after pool.managedBlock completes
     return item;
   }
 }

Summary

Public methods

abstract boolean block()

可能阻塞当前线程,例如等待锁定或条件。

abstract boolean isReleasable()

如果不需要阻塞,则返回 true

Public methods

block

Added in API level 21
boolean block ()

可能阻塞当前线程,例如等待锁定或条件。

Returns
boolean true if no additional blocking is necessary (i.e., if isReleasable would return true)
Throws
InterruptedException if interrupted while waiting (the method is not required to do so, but is allowed to)

isReleasable

Added in API level 21
boolean isReleasable ()

如果不需要阻塞,则返回 true

Returns
boolean true if blocking is unnecessary

Hooray!