Question 123
Click the Exhibit button. 
Given: 
1. public class TwoThreads { 

3. private static Object resource = new Object();
4. 
5. private static void delay(long n) { 
6. try { Thread.sleep(n); } 
7. catch (Exception e) { System.out.print(“Error “); 
8. } 

10. public static void main(String[] args) { 
11. System.out.print(“StartMain “)
12. new Thread1().start(); 
13. delay(1000); 
14. Thread t2 = new Thread2(); 
15. t2.start(); 
16. delay(1000); 
17. t2.interrupt(); 
18. delay(1000); 
19. System.out.print(“EndMain “)
20. } 
21. 
22. static class Thread 1 extends Thread { 
23. public void run() { 
24. synchronized (resource) { 
25. System.out.print(“Startl “)
26. delay(6000); 
27. System.out.print(“End1 “)
28. } 
29. } 
30. } 
31. 
32. static class Thread2 extends Thread { 
33. public void run() { 
34. synchronized (resource) { 
35. System.out.print(“Start2 
); 
36. delay(2000); 
37. System.out.print(“End2 “)
38. } 
39. } 
40. } 
41. } 
Assume that sleep(n) executes in exactly m milliseconds, and all other 
code executes in an insignificant amount of time. What is the output if 
the main() method is run? 
A. Compilation fails. 
B. Deadlock occurs. 
C. StartMain Start1 Error EndMain End1
D. StartMain Start1 EndMain End1 Start2 End2 
E. StartMain Start1 Error Start2 EndMain End2 End1
F. StartMain Start1 Start2 Error End2 EndMain End1
G. StartMain Start1 EndMain End1 Start2 Error End2 Answer: G完全不懂!!!!!只能自己排除A,希望神仙哥哥姐姐们能够仔细地帮助小弟分析一下为什么会是这个答案.至于答案中的“Error”,我查出是: java.lang.InterruptedException: sleep interrupted.请问题目中的哪些代码引发了这个错误,如何修改题目才能够避免这个错误呢????谢谢………

解决方案 »

  1.   

    1.输出"StartMain"..没什么好说的2.新开了一个线程t1,由于主线程在睡觉,So马上输出"Start1"..也没啥好说的3.又开了一个线程t2,由于刚开始run()就遇到了resource的锁,没钥匙(在t1手上),进不去,等吧...4.t2.interrupt()   
      "wait,sleep等阻塞中的线程调用interrupt(),会以抛出InterruptedException异常的形式结束阻塞,而并不会终止线程"
      t2现在阻塞了么?没有..所以没有任何反应....现在如果调用t2.isInterrupted()会返回true5.看时间主线程该执行完了,所以输出"EndMain "6.t1线程输出"End1",同时释放resource的锁7.t2线程拿到钥匙,马上输出"Start2"8.t2开始睡觉,很不幸立刻被打断了,因为t2.isInterrupted()为true,抛出java.lang.InterruptedException异常
      被捕获,输出"Error"9.最后t2线程输出"End2"线程的东西我自认没有完全弄明白,有不对的大家指点指点 ^^
      

  2.   

    我想过程应该是这样的,个人观点,欢迎指正
    线程的运行顺序:
    main(0 ~ delay())   //Sysout("StartMain");
    ↓main  delay()
    Thread1 //Sysout("Start1");
    ↓delay(6000) 所以main的delay()完成后,main线程又开始运行
    t2.start()
    ↓由于Object被锁,所以暂时无法执行,main线程继续
    main  delay(1000);

    t2.interrupt();//此时,t2无wait,sleep,notify等等,所以不会抛出InterruptedException,但此时t2.interrupted()返回true

    main delay(1000)

    Sysout("EndMain");
    ↓Thread1中的delay(6000)完成了
    Sysout("End1");
    ↓//Thread1结束,翻译Object的同步锁,Thread2得到Object的访问权限
    Sysout("Start2");
    ↓//进行t2的sleep(2000),但是由于此时已经t2.interrupted()返回true,所以抛出InterruptedException(),进而:

    Sysout("Error");

    Sysout("End2");//全部结束.