Waits for another thread to arrive at this exchange point (unless the current thread is {@linkplain Thread#interrupt interrupted}), and then transfers the given object to it, receiving its object in return.
If another thread is already waiting at the exchange point then it is resumed for thread scheduling purposes and receives the object passed in by the current thread. The current thread returns immediately, receiving the object passed to the exchange by that other thread.
If no other thread is already waiting at the exchange then the current thread is disabled for thread scheduling purposes and lies dormant until one of two things happens:
- Some other thread enters the exchange; or
- Some other thread {@linkplain Thread#interrupt interrupts}the current thread.
If the current thread:
- has its interrupted status set on entry to this method; or
- is {@linkplain Thread#interrupt interrupted} while waitingfor the exchange,
then {@link InterruptedException} is thrown and the current thread'sinterrupted status is cleared.
@param x the object to exchange
@return the object provided by the other thread
@throws InterruptedException if the current thread wasinterrupted while waiting