| /* |
| * Written by Doug Lea with assistance from members of JCP JSR-166 |
| * Expert Group and released to the public domain, as explained at |
| * http://creativecommons.org/licenses/publicdomain |
| * Other contributors include Andrew Wright, Jeffrey Hayes, |
| * Pat Fisher, Mike Judd. |
| */ |
| |
| import junit.framework.*; |
| import java.util.*; |
| import java.util.concurrent.*; |
| |
| public class ExchangerTest extends JSR166TestCase { |
| |
| public static void main(String[] args) { |
| junit.textui.TestRunner.run (suite()); |
| } |
| public static Test suite() { |
| return new TestSuite(ExchangerTest.class); |
| } |
| |
| /** |
| * exchange exchanges objects across two threads |
| */ |
| public void testExchange() { |
| final Exchanger e = new Exchanger(); |
| Thread t1 = new Thread(new Runnable(){ |
| public void run(){ |
| try { |
| Object v = e.exchange(one); |
| threadAssertEquals(v, two); |
| Object w = e.exchange(v); |
| threadAssertEquals(w, one); |
| } catch(InterruptedException e){ |
| threadUnexpectedException(); |
| } |
| } |
| }); |
| Thread t2 = new Thread(new Runnable(){ |
| public void run(){ |
| try { |
| Object v = e.exchange(two); |
| threadAssertEquals(v, one); |
| Object w = e.exchange(v); |
| threadAssertEquals(w, two); |
| } catch(InterruptedException e){ |
| threadUnexpectedException(); |
| } |
| } |
| }); |
| try { |
| t1.start(); |
| t2.start(); |
| t1.join(); |
| t2.join(); |
| } catch(InterruptedException ex) { |
| unexpectedException(); |
| } |
| } |
| |
| /** |
| * timed exchange exchanges objects across two threads |
| */ |
| public void testTimedExchange() { |
| final Exchanger e = new Exchanger(); |
| Thread t1 = new Thread(new Runnable(){ |
| public void run(){ |
| try { |
| Object v = e.exchange(one, SHORT_DELAY_MS, TimeUnit.MILLISECONDS); |
| threadAssertEquals(v, two); |
| Object w = e.exchange(v, SHORT_DELAY_MS, TimeUnit.MILLISECONDS); |
| threadAssertEquals(w, one); |
| } catch(InterruptedException e){ |
| threadUnexpectedException(); |
| } catch(TimeoutException toe) { |
| threadUnexpectedException(); |
| } |
| } |
| }); |
| Thread t2 = new Thread(new Runnable(){ |
| public void run(){ |
| try { |
| Object v = e.exchange(two, SHORT_DELAY_MS, TimeUnit.MILLISECONDS); |
| threadAssertEquals(v, one); |
| Object w = e.exchange(v, SHORT_DELAY_MS, TimeUnit.MILLISECONDS); |
| threadAssertEquals(w, two); |
| } catch(InterruptedException e){ |
| threadUnexpectedException(); |
| } catch(TimeoutException toe) { |
| threadUnexpectedException(); |
| } |
| } |
| }); |
| try { |
| t1.start(); |
| t2.start(); |
| t1.join(); |
| t2.join(); |
| } catch(InterruptedException ex) { |
| unexpectedException(); |
| } |
| } |
| |
| /** |
| * interrupt during wait for exchange throws IE |
| */ |
| public void testExchange_InterruptedException(){ |
| final Exchanger e = new Exchanger(); |
| Thread t = new Thread(new Runnable() { |
| public void run(){ |
| try { |
| e.exchange(one); |
| threadShouldThrow(); |
| } catch(InterruptedException success){ |
| } |
| } |
| }); |
| try { |
| t.start(); |
| Thread.sleep(SHORT_DELAY_MS); |
| t.interrupt(); |
| t.join(); |
| } catch(InterruptedException ex) { |
| unexpectedException(); |
| } |
| } |
| |
| /** |
| * interrupt during wait for timed exchange throws IE |
| */ |
| public void testTimedExchange_InterruptedException(){ |
| final Exchanger e = new Exchanger(); |
| Thread t = new Thread(new Runnable() { |
| public void run(){ |
| try { |
| e.exchange(null, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS); |
| threadShouldThrow(); |
| } catch(InterruptedException success){ |
| } catch(Exception e2){ |
| threadFail("should throw IE"); |
| } |
| } |
| }); |
| try { |
| t.start(); |
| t.interrupt(); |
| t.join(); |
| } catch(InterruptedException ex){ |
| unexpectedException(); |
| } |
| } |
| |
| /** |
| * timeout during wait for timed exchange throws TOE |
| */ |
| public void testExchange_TimeOutException(){ |
| final Exchanger e = new Exchanger(); |
| Thread t = new Thread(new Runnable() { |
| public void run(){ |
| try { |
| e.exchange(null, SHORT_DELAY_MS, TimeUnit.MILLISECONDS); |
| threadShouldThrow(); |
| } catch(TimeoutException success){ |
| } catch(InterruptedException e2){ |
| threadFail("should throw TOE"); |
| } |
| } |
| }); |
| try { |
| t.start(); |
| t.join(); |
| } catch(InterruptedException ex){ |
| unexpectedException(); |
| } |
| } |
| |
| /** |
| * If one exchanging thread is interrupted, another succeeds. |
| */ |
| public void testReplacementAfterExchange() { |
| final Exchanger e = new Exchanger(); |
| Thread t1 = new Thread(new Runnable(){ |
| public void run(){ |
| try { |
| Object v = e.exchange(one); |
| threadAssertEquals(v, two); |
| Object w = e.exchange(v); |
| threadShouldThrow(); |
| } catch(InterruptedException success){ |
| } |
| } |
| }); |
| Thread t2 = new Thread(new Runnable(){ |
| public void run(){ |
| try { |
| Object v = e.exchange(two); |
| threadAssertEquals(v, one); |
| Thread.sleep(SMALL_DELAY_MS); |
| Object w = e.exchange(v); |
| threadAssertEquals(w, three); |
| } catch(InterruptedException e){ |
| threadUnexpectedException(); |
| } |
| } |
| }); |
| Thread t3 = new Thread(new Runnable(){ |
| public void run(){ |
| try { |
| Thread.sleep(SMALL_DELAY_MS); |
| Object w = e.exchange(three); |
| threadAssertEquals(w, one); |
| } catch(InterruptedException e){ |
| threadUnexpectedException(); |
| } |
| } |
| }); |
| |
| try { |
| t1.start(); |
| t2.start(); |
| t3.start(); |
| Thread.sleep(SHORT_DELAY_MS); |
| t1.interrupt(); |
| t1.join(); |
| t2.join(); |
| t3.join(); |
| } catch(InterruptedException ex) { |
| unexpectedException(); |
| } |
| } |
| |
| } |