java多線程面試題


1.什么是多線程編程?什么時候使用?
多線程一般用於當一個程序需要同時做一個以上的任務。多線程通常用於GUI交互程序。一個新的線程被創建做一些耗時的工作,當主線程保持界面與用戶的交互。

2.為什么wait(),notify()和notifyall()函數定義在Object類里面?
因為所有類都是繼承於Object類,這樣所有類就可以簡單的進行多線程編程了。

3.wait()方法和sleep()方法有什么不同?
sleep()方法執行后仍然擁有線程,只是延時。而wait方法放棄了線程控制,其它線程可以運行。

4.Thread和Runnable有什么不同?
JAVA線程控制着程序執行的主路徑。當你用java命令調用JVM時,JVM創建了一個隱式線程來執行main方法。Thread類提供了主線程調用其它線程並行運行的機制。

Runnable接口定義了一個能被Thread運行的類。實現Runnable的類只需要實行run方法。可以很靈活的擴展現在的已經繼承自其它父類的類。而thread則不可以,因為java只允許繼承一個父類。

5.我可以重載start()方法么?
因為Thread類的start()方法並不是final方法,因此可以,但不推薦這樣做。因為在start()方法里創建一個新的線程,進行特定的操作。你可以傳遞一個實現了Runnable接口的類到Thread,或者繼承Thread類,重載run()方法。

6. SwingUtilities.invokeLater(Runnable)方法是用來做什么用的?
這個方法可以在不干擾GUI的事件隊列的情況下在應用程序中執行一個線程。它將runnable對象放在事件的隊列中然后立即返回。只有當這個隊象移到隊列的最前端時它的run()方法才被調用。

7.volatile是用來做什么的?
volatile 的意思是變量的值不能被JVM優化,這樣可以在某一程度上保證變量的可見性。

8.什么是綠色線程?
綠色線程是指所有的代碼JVM都執行在單個操作系統線程,即使是多線程程序,JVM間斷的控制多線程程序而不是用其它的操作系統線程,這種模式已經被廢棄了。

9.編譯運行下面的代碼會發生什么?

  1. public class Bground extends  Thread{
  2.     public static void main( String argv[])
  3.     {
  4.         Bground b = new Bground();
  5.         b.run();
  6.     }
  7.     public void start()
  8.     {
  9.        for (int i = 0; i <10; i++){
  10.             System.out.println("Value of i = " + i);
  11.        }
  12.     }
  13. }


A.編譯錯誤,Thread類中的run方法沒有定義
B.運行時錯誤,Thread類中的run方法沒有定義
C.編譯無錯,打印0到9.
D.編譯無錯,不打印任何值
答案:D,調用run不創建線程。


10.關於下面一段代碼,哪些描述是正確的

  1. public class Agg {
  2.     public static void main( String argv[]) {
  3.         Agg a = new Agg();
  4.         a.go();
  5.     }
  6.  
  7.     public void go() {
  8.         DSRoss ds1 = new DSRoss("one");
  9.         ds1.start();
  10.     }
  11. }
  12.  
  13. class DSRoss extends  Thread {
  14.     private  String sTname = "";
  15.  
  16.     DSRoss( String s) {
  17.         sTname = s;
  18.     }
  19.  
  20.     public void run() {
  21.         notwait();
  22.          System.out.println("finished");
  23.     }
  24.  
  25.     public void notwait() {
  26.         while (true) {
  27.             try {
  28.                  System.out.println("waiting");
  29.                 wait();
  30.             } catch ( InterruptedException ie) {
  31.             }
  32.              System.out.println(sTname);
  33.             notifyAll();
  34.         }
  35.     }
  36. }

A.編譯錯誤
B.能夠編譯,輸出“waiting"
C.能夠編譯, 輸出“waiting",緊接着輸出"finish"
D.運行時錯誤,會拋異常
答案:D,wait必須在Synchronize塊或者函數里。


11.編譯運行下面的代碼會發生什么

  1. public class Test extends  Thread {
  2.     private  String sThreadName;
  3.  
  4.     public static void main( String argv[]) {
  5.         Test h = new Test();
  6.         h.go();
  7.     }
  8.  
  9.     Test() {
  10.     }
  11.  
  12.     Test( String s) {
  13.         sThreadName = s;
  14.     }
  15.  
  16.     public  String getThreadName() {
  17.         return sThreadName;
  18.     }
  19.  
  20.     public void go() {
  21.         Test first = new Test("first");
  22.         first.start();
  23.         Test second = new Test("second");
  24.         second.start();
  25.     }
  26.  
  27.     public void start() {
  28.         for (int i = 0; i < 2; i++) {
  29.              System.out.println(getThreadName() + i);
  30.             try {
  31.                  Thread.sleep(100);
  32.             } catch ( InterruptedException e) {
  33.                  System.out.println(e.getMessage());
  34.             }
  35.         }
  36.     }
  37. }

A.編譯錯誤
B.輸出first0, second0, first1, second1.
C.輸出first0, first1, second0, second1.
D.運行時錯誤
答案:C,如果要實現B的效果的話應該重載run,而不是start


12.編譯運行下面的代碼會發生什么

  1. public class Test {
  2.     public static void main( String argv[]) {
  3.         Pmcraven pm1 = new Pmcraven("one");
  4.         pm1.run();
  5.         Pmcraven pm2 = new Pmcraven("two");
  6.         pm2.run();
  7.     }
  8. }
  9.  
  10. class Pmcraven extends  Thread {
  11.     private  String sTname = "";
  12.  
  13.     Pmcraven( String s) {
  14.         sTname = s;
  15.     }
  16.  
  17.     public void run() {
  18.         for (int i = 0; i < 2; i++) {
  19.             try {
  20.                 sleep(1000);
  21.             } catch ( InterruptedException e) {
  22.             }
  23.             yield();
  24.              System.out.println(sTname);
  25.         }
  26.     }
  27. }

A.編譯錯誤
B.輸出One One Two Two
C.輸出One Two One Two
D.輸出One Two One Two
答案B 調用run不創建線程。仍然是同步。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM