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

进程与线程

开发平台:

Java

  1. public class Deadlock extends Object {
  2. private String objID;
  3. public Deadlock(String id) {
  4. objID = id;
  5. }
  6. public synchronized void checkOther(Deadlock other) {
  7. print("entering checkOther()");
  8. // simulate some lengthy process
  9. try { Thread.sleep(2000); } 
  10. catch ( InterruptedException x ) { }
  11. print("in checkOther() - about to " +
  12. "invoke 'other.action()'");
  13. other.action();
  14. print("leaving checkOther()");
  15. }
  16. public synchronized void action() {
  17. print("entering action()");
  18. // simulate some work here
  19. try { Thread.sleep(500); } 
  20. catch ( InterruptedException x ) { }
  21. print("leaving action()");
  22. }
  23. public void print(String msg) {
  24. threadPrint("objID=" + objID + " - " + msg);
  25. }
  26. public static void threadPrint(String msg) {
  27. String threadName = Thread.currentThread().getName();
  28. System.out.println(threadName + ": " + msg);
  29. }
  30. public static void main(String[] args) {
  31. final Deadlock obj1 = new Deadlock("obj1");
  32. final Deadlock obj2 = new Deadlock("obj2");
  33. Runnable runA = new Runnable() {
  34. public void run() {
  35. obj1.checkOther(obj2);
  36. }
  37. };
  38. Thread threadA = new Thread(runA, "threadA");
  39. threadA.start();
  40. try { Thread.sleep(200); } 
  41. catch ( InterruptedException x ) { }
  42. Runnable runB = new Runnable() {
  43. public void run() {
  44. obj2.checkOther(obj1);
  45. }
  46. };
  47. Thread threadB = new Thread(runB, "threadB");
  48. threadB.start();
  49. try { Thread.sleep(5000); } 
  50. catch ( InterruptedException x ) { }
  51. threadPrint("finished sleeping");
  52. threadPrint("about to interrupt() threadA");
  53. threadA.interrupt();
  54. try { Thread.sleep(1000); } 
  55. catch ( InterruptedException x ) { }
  56. threadPrint("about to interrupt() threadB");
  57. threadB.interrupt();
  58. try { Thread.sleep(1000); } 
  59. catch ( InterruptedException x ) { }
  60. threadPrint("did that break the deadlock?");
  61. }
  62. }