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

进程与线程

开发平台:

Java

  1. import java.util.*;
  2. public class EarlyNotifyFix extends Object {
  3. private List list;
  4. public EarlyNotifyFix() {
  5. list = Collections.synchronizedList(new LinkedList());
  6. }
  7. public String removeItem() throws InterruptedException {
  8. print("in removeItem() - entering");
  9. synchronized ( list ) {
  10. while ( list.isEmpty() ) {
  11. print("in removeItem() - about to wait()");
  12. list.wait();
  13. print("in removeItem() - done with wait()");
  14. }
  15. // extract the new first item
  16. String item = (String) list.remove(0);
  17. print("in removeItem() - leaving");
  18. return item;
  19. }
  20. }
  21. public void addItem(String item) {
  22. print("in addItem() - entering");
  23. synchronized ( list ) {
  24. // There'll always be room to add to this List 
  25. // because it expands as needed. 
  26. list.add(item);
  27. print("in addItem() - just added: '" + item + "'");
  28. // After adding, notify any and all waiting 
  29. // threads that the list has changed.
  30. list.notifyAll();
  31. print("in addItem() - just notified");
  32. }
  33. print("in addItem() - leaving");
  34. }
  35. private static void print(String msg) {
  36. String name = Thread.currentThread().getName();
  37. System.out.println(name + ": " + msg);
  38. }
  39. public static void main(String[] args) {
  40. final EarlyNotifyFix enf = new EarlyNotifyFix();
  41. Runnable runA = new Runnable() {
  42. public void run() {
  43. try {
  44. String item = enf.removeItem();
  45. print("in run() - returned: '" + 
  46. item + "'");
  47. } catch ( InterruptedException ix ) {
  48. print("interrupted!");
  49. } catch ( Exception x ) {
  50. print("threw an Exception!!!n" + x);
  51. }
  52. }
  53. };
  54. Runnable runB = new Runnable() {
  55. public void run() {
  56. enf.addItem("Hello!");
  57. }
  58. };
  59. try {
  60. Thread threadA1 = new Thread(runA, "threadA1");
  61. threadA1.start();
  62. Thread.sleep(500);
  63. // start a *second* thread trying to remove
  64. Thread threadA2 = new Thread(runA, "threadA2");
  65. threadA2.start();
  66. Thread.sleep(500);
  67. Thread threadB = new Thread(runB, "threadB");
  68. threadB.start();
  69. Thread.sleep(10000); // wait 10 seconds
  70. threadA1.interrupt();
  71. threadA2.interrupt();
  72. } catch ( InterruptedException x ) {
  73. // ignore
  74. }
  75. }
  76. }