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

进程与线程

开发平台:

Java

  1. public class AlternateSuspendResume 
  2. extends Object 
  3. implements Runnable {
  4. private volatile int firstVal;
  5. private volatile int secondVal;
  6. private volatile boolean suspended;
  7. public boolean areValuesEqual() {
  8. return ( firstVal == secondVal );
  9. }
  10. public void run() {
  11. try {
  12. suspended = false;
  13. firstVal = 0;
  14. secondVal = 0;
  15. workMethod();
  16. } catch ( InterruptedException x ) {
  17. System.out.println(
  18. "interrupted while in workMethod()");
  19. }
  20. }
  21. private void workMethod() throws InterruptedException {
  22. int val = 1;
  23. while ( true ) {
  24. // blocks only if suspended is true
  25. waitWhileSuspended(); 
  26. stepOne(val);
  27. stepTwo(val);
  28. val++;
  29. // blocks only if suspended is true
  30. waitWhileSuspended(); 
  31. Thread.sleep(200);  // pause before looping again
  32. }
  33. }
  34. private void stepOne(int newVal) 
  35. throws InterruptedException {
  36. firstVal = newVal;
  37. // simulate some other lengthy process
  38. Thread.sleep(300);  
  39. }
  40. private void stepTwo(int newVal) {
  41. secondVal = newVal;
  42. }
  43. public void suspendRequest() {
  44. suspended = true;
  45. }
  46. public void resumeRequest() {
  47. suspended = false;
  48. }
  49. private void waitWhileSuspended() 
  50. throws InterruptedException {
  51. // This is an example of a "busy wait" technique.  It is
  52. // not the best way to wait for a condition to change 
  53. // because it continually requires some processor 
  54. // cycles to perform the checks.  A better technique 
  55. // is to use Java's built-in wait-notify mechanism.
  56. while ( suspended ) {
  57. Thread.sleep(200);
  58. }
  59. }
  60. public static void main(String[] args) {
  61. AlternateSuspendResume asr = 
  62. new AlternateSuspendResume();
  63. Thread t = new Thread(asr);
  64. t.start();
  65. // let the other thread get going and run for a while
  66. try { Thread.sleep(1000); } 
  67. catch ( InterruptedException x ) { }
  68. for ( int i = 0; i < 10; i++ ) {
  69. asr.suspendRequest();
  70. // Give the thread a chance to notice the 
  71. // suspension request.
  72. try { Thread.sleep(350); } 
  73. catch ( InterruptedException x ) { }
  74. System.out.println("dsr.areValuesEqual()=" + 
  75. asr.areValuesEqual());
  76. asr.resumeRequest();
  77. try { 
  78. // Pause for a random amount of time 
  79. // between 0 and 2 seconds.
  80. Thread.sleep(
  81. ( long ) (Math.random() * 2000.0) );
  82. } catch ( InterruptedException x ) {
  83. // ignore
  84. }
  85. }
  86. System.exit(0); // abruptly terminate application
  87. }
  88. }