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

进程与线程

开发平台:

Java

  1. public class EarlyReturn extends Object {
  2. private volatile int value;
  3. public EarlyReturn(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 +
  18. ",minValue=" + minValue);
  19. if ( value < minValue ) {
  20. wait(msTimeout);
  21. }
  22. System.out.println("leaving waitUntilAtLeast() - " + 
  23. "value=" + value +
  24. ",minValue=" + minValue);
  25. // May have timed out, or may have met value, 
  26. // calc return value.
  27. return ( value >= minValue );
  28. }
  29. public static void main(String[] args) {
  30. try {
  31. final EarlyReturn er = new EarlyReturn(0);
  32. Runnable r = new Runnable() {
  33. public void run() {
  34. try {
  35. Thread.sleep(1500);
  36. er.setValue(2);
  37. Thread.sleep(500);
  38. er.setValue(3);
  39. Thread.sleep(500);
  40. er.setValue(4);
  41. } catch ( Exception x ) {
  42. x.printStackTrace();
  43. }
  44. }
  45. };
  46. Thread t = new Thread(r);
  47. t.start();
  48. System.out.println(
  49. "about to: waitUntilAtLeast(5, 3000)");
  50. long startTime = System.currentTimeMillis();
  51. boolean retVal = er.waitUntilAtLeast(5, 3000);
  52. long elapsedTime = 
  53. System.currentTimeMillis() - startTime;
  54. System.out.println("after " + elapsedTime + 
  55. " ms, retVal=" + retVal);
  56. } catch ( InterruptedException ix ) {
  57. ix.printStackTrace();
  58. }
  59. }
  60. }