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

进程与线程

开发平台:

Java

  1. public class BooleanLock extends Object {
  2. private boolean value;
  3. public BooleanLock(boolean initialValue) {
  4. value = initialValue;
  5. }
  6. public BooleanLock() {
  7. this(false);
  8. }
  9. public synchronized void setValue(boolean newValue) {
  10. if ( newValue != value ) {
  11. value = newValue;
  12. notifyAll();
  13. }
  14. }
  15. public synchronized boolean waitToSetTrue(long msTimeout) 
  16. throws InterruptedException {
  17. boolean success = waitUntilFalse(msTimeout);
  18. if ( success ) {
  19. setValue(true);
  20. }
  21. return success;
  22. }
  23. public synchronized boolean waitToSetFalse(long msTimeout) 
  24. throws InterruptedException {
  25. boolean success = waitUntilTrue(msTimeout);
  26. if ( success ) {
  27. setValue(false);
  28. }
  29. return success;
  30. }
  31. public synchronized boolean isTrue() {
  32. return value;
  33. }
  34. public synchronized boolean isFalse() {
  35. return !value;
  36. }
  37. public synchronized boolean waitUntilTrue(long msTimeout) 
  38. throws InterruptedException {
  39. return waitUntilStateIs(true, msTimeout);
  40. }
  41. public synchronized boolean waitUntilFalse(long msTimeout) 
  42. throws InterruptedException {
  43. return waitUntilStateIs(false, msTimeout);
  44. }
  45. public synchronized boolean waitUntilStateIs(
  46. boolean state, 
  47. long msTimeout
  48. ) throws InterruptedException {
  49. if ( msTimeout == 0L ) {
  50. while ( value != state ) {
  51. wait();  // wait indefinitely until notified
  52. }
  53. // condition has finally been met
  54. return true;
  55. // only wait for the specified amount of time
  56. long endTime = System.currentTimeMillis() + msTimeout;
  57. long msRemaining = msTimeout;
  58. while ( ( value != state ) && ( msRemaining > 0L ) ) {
  59. wait(msRemaining);
  60. msRemaining = endTime - System.currentTimeMillis();
  61. }
  62. // May have timed out, or may have met value, 
  63. // calculate return value.
  64. return ( value == state );
  65. }
  66. }