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

进程与线程

开发平台:

Java

  1. public class EarlyReturnFix extends Object {
  2. private volatile int value;
  3. public EarlyReturnFix(int initialValue) {
  4. value = initialValue;
  5. }
  6. public synchronized void setValue(int newValue) {
  7. if ( value != newValue ) {
  8. value = newValue;
  9. notifyAll();
  10. }
  11. }
  12. public synchronized boolean waitUntilAtLeast(
  13. int minValue,
  14. long msTimeout
  15. ) throws InterruptedException {
  16. System.out.println("entering waitUntilAtLeast() - " + 
  17. "value=" + value + ",minValue=" + minValue);
  18. long endTime = System.currentTimeMillis() + msTimeout;
  19. long msRemaining = msTimeout;
  20. while ( ( value < minValue ) && ( msRemaining > 0L ) ) {
  21. System.out.println("in waitUntilAtLeast() - " + 
  22. "about to: wait(" + msRemaining + ")");
  23. wait(msRemaining);
  24. msRemaining = endTime - System.currentTimeMillis();
  25. System.out.println("in waitUntilAtLeast() - " +
  26. "back from wait(), new msRemaining=" +
  27. msRemaining);
  28. }
  29. System.out.println("leaving waitUntilAtLeast() - " +
  30. "value=" + value + ",minValue=" + minValue);
  31. // May have timed out, or may have met value, 
  32. // calc return value.
  33. return ( value >= minValue );
  34. }
  35. public static void main(String[] args) {
  36. try {
  37. final EarlyReturnFix er = new EarlyReturnFix(0);
  38. Runnable r = new Runnable() {
  39. public void run() {
  40. try {
  41. Thread.sleep(1500);
  42. er.setValue(2);
  43. Thread.sleep(500);
  44. er.setValue(3);
  45. Thread.sleep(500);
  46. er.setValue(4);
  47. } catch ( Exception x ) {
  48. x.printStackTrace();
  49. }
  50. }
  51. };
  52. Thread t = new Thread(r);
  53. t.start();
  54. System.out.println(
  55. "about to: waitUntilAtLeast(5, 3000)");
  56. long startTime = System.currentTimeMillis();
  57. boolean retVal = er.waitUntilAtLeast(5, 3000);
  58. long elapsedTime = 
  59. System.currentTimeMillis() - startTime;
  60. System.out.println("after " + elapsedTime + 
  61. " ms, retVal=" + retVal);
  62. } catch ( InterruptedException ix ) {
  63. ix.printStackTrace();
  64. }
  65. }
  66. }