Class BlockingCell<T>

  • Direct Known Subclasses:
    BlockingValueOrException

    public class BlockingCell<T>
    extends Object
    Simple one-shot IPC mechanism. Essentially a one-place buffer that cannot be emptied once filled.
    • Constructor Summary

      Constructors 
      Constructor Description
      BlockingCell()
      Instantiate a new BlockingCell waiting for a value of the specified type.
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      T get()
      Wait for a value, and when one arrives, return it (without clearing it).
      T get​(long timeout)
      Wait for a value, and when one arrives, return it (without clearing it).
      void set​(T newValue)
      Store a value in this BlockingCell, throwing AssertionError if the cell already has a value.
      boolean setIfUnset​(T newValue)
      Store a value in this BlockingCell if it doesn't already have a value.
      T uninterruptibleGet()
      As get(), but catches and ignores InterruptedException, retrying until a value appears.
      T uninterruptibleGet​(int timeout)
      As get(long timeout), but catches and ignores InterruptedException, retrying until a value appears or until specified timeout is reached.
    • Constructor Detail

      • BlockingCell

        public BlockingCell()
        Instantiate a new BlockingCell waiting for a value of the specified type.
    • Method Detail

      • get

        public T get()
              throws InterruptedException
        Wait for a value, and when one arrives, return it (without clearing it). If there's already a value present, there's no need to wait - the existing value is returned.
        Returns:
        the waited-for value
        Throws:
        InterruptedException - if this thread is interrupted
      • get

        public T get​(long timeout)
              throws InterruptedException,
                     TimeoutException
        Wait for a value, and when one arrives, return it (without clearing it). If there's already a value present, there's no need to wait - the existing value is returned. If timeout is reached and value hasn't arrived, TimeoutException is thrown.
        Parameters:
        timeout - timeout in milliseconds. -1 effectively means infinity
        Returns:
        the waited-for value
        Throws:
        InterruptedException - if this thread is interrupted
        TimeoutException
      • uninterruptibleGet

        public T uninterruptibleGet()
        As get(), but catches and ignores InterruptedException, retrying until a value appears.
        Returns:
        the waited-for value
      • uninterruptibleGet

        public T uninterruptibleGet​(int timeout)
                             throws TimeoutException
        As get(long timeout), but catches and ignores InterruptedException, retrying until a value appears or until specified timeout is reached. If timeout is reached, TimeoutException is thrown. We also use System.nanoTime() to behave correctly when system clock jumps around.
        Parameters:
        timeout - timeout in milliseconds. -1 means 'infinity': never time out
        Returns:
        the waited-for value
        Throws:
        TimeoutException
      • set

        public void set​(T newValue)
        Store a value in this BlockingCell, throwing AssertionError if the cell already has a value.
        Parameters:
        newValue - the new value to store
      • setIfUnset

        public boolean setIfUnset​(T newValue)
        Store a value in this BlockingCell if it doesn't already have a value.
        Parameters:
        newValue - the new value to store
        Returns:
        true if this call to setIfUnset actually updated the BlockingCell; false if the cell already had a value.