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

进程与线程

开发平台:

Java

  1. public class MissedNotifyFix extends Object {
  2. private Object proceedLock;
  3. private boolean okToProceed;
  4. public MissedNotifyFix() {
  5. print("in MissedNotify()");
  6. proceedLock = new Object();
  7. okToProceed = false;
  8. }
  9. public void waitToProceed() throws InterruptedException {
  10. print("in waitToProceed() - entered");
  11. synchronized ( proceedLock ) {
  12. print("in waitToProceed() - entered sync block");
  13. while ( okToProceed == false ) {
  14. print("in waitToProceed() - about to wait()");
  15. proceedLock.wait();
  16. print("in waitToProceed() - back from wait()");
  17. }
  18. print("in waitToProceed() - leaving sync block");
  19. }
  20. print("in waitToProceed() - leaving");
  21. }
  22. public void proceed() {
  23. print("in proceed() - entered");
  24. synchronized ( proceedLock ) {
  25. print("in proceed() - entered sync block");
  26. okToProceed = true;
  27. print("in proceed() - changed okToProceed to true");
  28. proceedLock.notifyAll();
  29. print("in proceed() - just did notifyAll()");
  30. print("in proceed() - leaving sync block");
  31. }
  32. print("in proceed() - leaving");
  33. }
  34. private static void print(String msg) {
  35. String name = Thread.currentThread().getName();
  36. System.out.println(name + ": " + msg);
  37. }
  38. public static void main(String[] args) {
  39. final MissedNotifyFix mnf = new MissedNotifyFix();
  40. Runnable runA = new Runnable() {
  41. public void run() {
  42. try {
  43. Thread.sleep(1000);
  44. mnf.waitToProceed();
  45. } catch ( InterruptedException x ) {
  46. x.printStackTrace();
  47. }
  48. }
  49. };
  50. Thread threadA = new Thread(runA, "threadA");
  51. threadA.start();
  52. Runnable runB = new Runnable() {
  53. public void run() {
  54. try {
  55. Thread.sleep(500);
  56. mnf.proceed();
  57. } catch ( InterruptedException x ) {
  58. x.printStackTrace();
  59. }
  60. }
  61. };
  62. Thread threadB = new Thread(runB, "threadB");
  63. threadB.start();
  64. try { 
  65. Thread.sleep(10000);
  66. } catch ( InterruptedException x ) {
  67. }
  68. print("about to invoke interrupt() on threadA");
  69. threadA.interrupt();
  70. }
  71. }