Question 123
Click the Exhibit button.
Given:
1. public class TwoThreads {
2
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. }
9
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这题目的代码可能有些小错,但是答案是选G,问题是Error是怎么输出的?main已经运行完了是怎么打断他sleep的?

解决方案 »

  1.   

    具体不多说了,LZ可以去看看线程同步互锁的问题
    public static void main(String[] args) { 
    11. System.out.print(”StartMain “); //先打印StartMain
    12. new Thread1().start(); //线程1开始打印Start1,线程1休眠6秒
    13. delay(1000); //主线程休眠1秒
    14. Thread t2 = new Thread2(); 
    15. t2.start(); //线程2开始,但resource被线程1锁住,所以线程停留在synchronized (resource)等待1线程放开锁
    16. delay(1000); //主线程继续再休眠1秒
    17. t2.interrupt //打断线程2休眠,给线程2发送个interrupt信号,但线程2在等待线程1放开锁,且并未休眠不能及时处理信号,信号被缓存
    18. delay(1000); //主线程继续休眠1秒
    19. System.out.print(”EndMain “); //打印EndMain
    20. } //主线程结束
    //时间达到6秒,线程1被唤醒,线程1打印End1
    //线程1执行结束,线程1放开resource锁
    //线程2获得resource锁,继续执行代码,打印Start2,然后休眠2秒
    //主线程发送的interrupt信号被线程2接收,线程2休眠被干扰,抛出异常,打印出Error
    //线程2被干扰醒来继续打印出End2
    //线程2执行结束
    //整个程序结束
      

  2.   

    很有意思的一个问题啊,下面是我加上了时间记录打出的结果:
    第0s StartMain
    第0s Startl
    第3s EndMain
    第6s End1
    第6s Start2
    第6s Error
    第6s End2查了下javadoc, 当call thread intterupt的时候,如果thread正在执行,只会设置interrupt状态,程序会继续执行,只有运行到sleep, wait, join, selector的时间才会抛出interruptException. 这样就能解释得通了第0s StartMain
    第0s Startl
    第3s EndMain
    打出来后,thread1在sleep, thread2因为拿不到锁被lock,虽然thead2已经设上的interrupt状态,但不会影响运行,thread1 sleep完后打出 End1, 然后thread2拿到锁开始执行,打出Start2, 进入sleep,这时候抛出interruptException,被delay里面catch, 打出Error,最后打出 End2