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

进程与线程

开发平台:

Java

  1. public class InterruptibleSyncBlock extends Object {
  2. private Object longLock;
  3. private BooleanLock busyLock;
  4. public InterruptibleSyncBlock() {
  5. longLock = new Object();
  6. busyLock = new BooleanLock(false);
  7. }
  8. public void doStuff() throws InterruptedException {
  9. print("about to try to get exclusive access " +
  10. "to busyLock");
  11. busyLock.waitToSetTrue(0);
  12. try {
  13. print("about to try to get exclusive access " +
  14. "to longLock");
  15. synchronized ( longLock ) {
  16. print("got exclusive access to longLock");
  17. try { 
  18. Thread.sleep(10000); 
  19. } catch ( InterruptedException x ) { 
  20. // ignore
  21. }
  22. print("about to relinquish exclusive access " +
  23. "to longLock");
  24. }
  25. } finally {
  26. print("about to free up busyLock");
  27. busyLock.setValue(false);
  28. }
  29. }
  30. private static void print(String msg) {
  31. String name = Thread.currentThread().getName();
  32. System.err.println(name + ": " + msg);
  33. }
  34. private static Thread launch(
  35. final InterruptibleSyncBlock sb, 
  36. String name
  37. ) {
  38. Runnable r = new Runnable() {
  39. public void run() {
  40. print("in run()");
  41. try {
  42. sb.doStuff();
  43. } catch ( InterruptedException x ) {
  44. print("InterruptedException thrown " +
  45. "from doStuff()");
  46. }
  47. }
  48. };
  49. Thread t = new Thread(r, name);
  50. t.start();
  51. return t;
  52. }
  53. public static void main(String[] args) {
  54. try {
  55. InterruptibleSyncBlock sb = 
  56. new InterruptibleSyncBlock();
  57. Thread t1 = launch(sb, "T1");
  58. Thread.sleep(500);
  59. Thread t2 = launch(sb, "T2");
  60. Thread t3 = launch(sb, "T3");
  61. Thread.sleep(1000);
  62. print("about to interrupt T2");
  63. t2.interrupt();
  64. print("just interrupted T2");
  65. } catch ( InterruptedException x ) {
  66. x.printStackTrace();
  67. }
  68. }
  69. }