Untitled


SUBMITTED BY: Guest

DATE: June 25, 2014, 5:11 p.m.

FORMAT: Text only

SIZE: 5.1 kB

HITS: 710

  1. package org.test.pingpong;
  2. import java.util.concurrent.BrokenBarrierException;
  3. import java.util.concurrent.CountDownLatch;
  4. import java.util.concurrent.CyclicBarrier;
  5. import java.util.concurrent.ExecutorService;
  6. import java.util.concurrent.Executors;
  7. public class Main {
  8. public static void main(String... args) throws InterruptedException {
  9. // Choose one:
  10. // countDownLatchSolution();
  11. // cyclicBarrierSolution();
  12. // queueMessagePassingSolution();
  13. }
  14. static volatile CountDownLatch pingLatch = new CountDownLatch(1);
  15. static volatile CountDownLatch pongLatch = new CountDownLatch(1);
  16. static class PingPongActivityZ extends Thread {
  17. private final IAction action;
  18. private final boolean isPing;
  19. public PingPongActivityZ(IAction act) {
  20. action = act;
  21. isPing = act instanceof Ping;
  22. }
  23. @Override
  24. public void run() {
  25. while (true) {
  26. try {
  27. (isPing ? pingLatch : pongLatch).await();
  28. action.doAction();
  29. resetLatch();
  30. (isPing ? pongLatch : pingLatch).countDown();
  31. } catch (InterruptedException e) {
  32. e.printStackTrace();
  33. }
  34. }
  35. }
  36. private void resetLatch() {
  37. if (isPing) {
  38. pingLatch = new CountDownLatch(1);
  39. } else {
  40. pongLatch = new CountDownLatch(1);
  41. }
  42. }
  43. }
  44. static void countDownLatchSolution() throws InterruptedException {
  45. Ping ping = new Ping();
  46. Pong pong = new Pong();
  47. Thread tPing = new PingPongActivityZ(ping);
  48. Thread tPong = new PingPongActivityZ(pong);
  49. tPing.start();
  50. tPong.start();
  51. // progress processing
  52. pingLatch.countDown();
  53. tPing.join();
  54. tPong.join();
  55. }
  56. static class PingPongActivity extends Thread {
  57. private final IAction action;
  58. private final CyclicBarrier actBarrier;
  59. private final CyclicBarrier oppActBarrier;
  60. public PingPongActivity(IAction act, CyclicBarrier actBarrier, CyclicBarrier oppActBarrier) {
  61. action = act;
  62. this.actBarrier = actBarrier;
  63. this.oppActBarrier = oppActBarrier;
  64. }
  65. @Override
  66. public void run() {
  67. while (true) {
  68. try {
  69. actBarrier.await();
  70. action.doAction();
  71. oppActBarrier.await();
  72. } catch (InterruptedException e) {
  73. e.printStackTrace();
  74. } catch (BrokenBarrierException e) {
  75. e.printStackTrace();
  76. }
  77. }
  78. }
  79. }
  80. static void cyclicBarrierSolution() throws InterruptedException {
  81. Ping ping = new Ping();
  82. Pong pong = new Pong();
  83. CyclicBarrier pingBarrier = new CyclicBarrier(2);
  84. CyclicBarrier pongBarrier = new CyclicBarrier(2);
  85. Thread tPing = new PingPongActivity(ping, pingBarrier, pongBarrier);
  86. Thread tPong = new PingPongActivity(pong, pongBarrier, pingBarrier);
  87. tPing.start();
  88. tPong.start();
  89. // progress processing
  90. try {
  91. pingBarrier.await();
  92. } catch (BrokenBarrierException e) {
  93. e.printStackTrace();
  94. }
  95. tPing.join();
  96. tPong.join();
  97. }
  98. static class PingPongActivityM implements Runnable {
  99. private final IAction action;
  100. private final ExecutorService oppActionActivity;
  101. private final IAction oppositeAction;
  102. private final ExecutorService actionActivity;
  103. public PingPongActivityM(IAction act, ExecutorService actActivity, IAction oppAction, ExecutorService oppActActivity) {
  104. action = act;
  105. actionActivity = actActivity;
  106. oppositeAction = oppAction;
  107. oppActionActivity = oppActActivity;
  108. }
  109. @Override
  110. public void run() {
  111. action.doAction();
  112. oppActionActivity.execute(new PingPongActivityM(oppositeAction, oppActionActivity, action, actionActivity));
  113. }
  114. }
  115. static void queueMessagePassingSolution() {
  116. ExecutorService pingActivity = Executors.newFixedThreadPool(1);
  117. ExecutorService pongActivity = Executors.newFixedThreadPool(1);
  118. Ping ping = new Ping();
  119. Pong pong = new Pong();
  120. pingActivity.execute(new PingPongActivityM(ping, pingActivity, pong, pongActivity));
  121. }
  122. }

comments powered by Disqus