BestReplacement.java
上传用户:songled
上传日期:2022-07-14
资源大小:94k
文件大小:4k
源码类别:

进程与线程

开发平台:

Java

  1. // uses BooleanLock from chapter 17
  2. public class BestReplacement extends Object {
  3. private Thread internalThread;
  4. private volatile boolean stopRequested;
  5. private BooleanLock suspendRequested;
  6. private BooleanLock internalThreadSuspended;
  7. public BestReplacement() {
  8. stopRequested = false;
  9. suspendRequested = new BooleanLock(false);
  10. internalThreadSuspended = new BooleanLock(false);
  11. Runnable r = new Runnable() {
  12. public void run() {
  13. try {
  14. runWork();
  15. } catch ( Exception x ) {
  16. // in case ANY exception slips through
  17. x.printStackTrace(); 
  18. }
  19. }
  20. };
  21. internalThread = new Thread(r);
  22. internalThread.start();
  23. }
  24. private void runWork() {
  25. int count = 0;
  26. while ( !stopRequested ) {
  27. try {
  28. waitWhileSuspended();
  29. } catch ( InterruptedException x ) {
  30. // Reassert interrupt so that remaining code
  31. // sees that an interrupt has been requested.
  32. Thread.currentThread().interrupt(); 
  33. // Reevaluate while condition --probably 
  34. // false now.
  35. continue;
  36. }
  37. System.out.println("Part I - count=" + count);
  38. try {
  39. Thread.sleep(1000);
  40. } catch ( InterruptedException x ) {
  41. Thread.currentThread().interrupt(); // reassert
  42. // continue on as if sleep completed normally
  43. }
  44. System.out.println("Part II - count=" + count);
  45. try {
  46. Thread.sleep(1000);
  47. } catch ( InterruptedException x ) {
  48. Thread.currentThread().interrupt(); // reassert
  49. // continue on as if sleep completed normally
  50. }
  51. System.out.println("Part III - count=" + count);
  52. count++;
  53. }
  54. }
  55. private void waitWhileSuspended() 
  56. throws InterruptedException {
  57. // only called by the internal thread - private method
  58. synchronized ( suspendRequested ) {
  59. if ( suspendRequested.isTrue() ) {
  60. try {
  61. internalThreadSuspended.setValue(true);
  62. suspendRequested.waitUntilFalse(0); 
  63. } finally {
  64. internalThreadSuspended.setValue(false);
  65. }
  66. }
  67. }
  68. }
  69. public void suspendRequest() {
  70. suspendRequested.setValue(true);
  71. }
  72. public void resumeRequest() {
  73. suspendRequested.setValue(false);
  74. }
  75. public boolean waitForActualSuspension(long msTimeout) 
  76. throws InterruptedException {
  77. // Returns 'true' if suspended, 'false' if the 
  78. // timeout expired.
  79. return internalThreadSuspended.waitUntilTrue(msTimeout);
  80. }
  81. public void stopRequest() {
  82. stopRequested = true;
  83. internalThread.interrupt();
  84. }
  85. public boolean isAlive() {
  86. return internalThread.isAlive();
  87. }
  88. public static void main(String[] args) {
  89. try {
  90. BestReplacement br = new BestReplacement();
  91. System.out.println(
  92. "--> just created, br.isAlive()=" + 
  93. br.isAlive());
  94. Thread.sleep(4200);
  95. long startTime = System.currentTimeMillis();
  96. br.suspendRequest();
  97. System.out.println(
  98. "--> just submitted a suspendRequest");
  99. boolean suspensionTookEffect = 
  100. br.waitForActualSuspension(10000);
  101. long stopTime = System.currentTimeMillis();
  102. if ( suspensionTookEffect ) {
  103. System.out.println(
  104. "--> the internal thread took " +
  105. (stopTime - startTime) + " ms to notice " +
  106. "n    the suspend request and is now " +
  107. "suspended.");
  108. } else {
  109. System.out.println(
  110. "--> the internal thread did not notice " +
  111. "the suspend request " +
  112. "n    within 10 seconds.");
  113. }
  114. Thread.sleep(5000);
  115. br.resumeRequest();
  116. System.out.println(
  117. "--> just submitted a resumeRequest");
  118. Thread.sleep(2200);
  119. br.stopRequest();
  120. System.out.println(
  121. "--> just submitted a stopRequest");
  122. } catch ( InterruptedException x ) {
  123. // ignore
  124. }
  125. }
  126. }