天天看點

關于多線程的幾道面試小題

1.自定義類MyThread繼承Thread類,為什麼要重寫run()方法?

  自定義類中不是所有的代碼都需要被線程執行。

  而這個時候,為了區分哪些代碼能夠被線程執行,java提供了Thread類中的run()方法,用來包含那些需要被線程執行的代碼。

  

  注意:這裡的 被線程執行 = 開一個新線程執行

2.run()和start()的差別?

  run():僅僅是封裝被線程執行的代碼,直接調用就是普通方法。

  start():首先啟動了線程,然後再由jvm去調用該線程的run()方法。

3.線程能不能多次啟動start()?

  不能,一個線程不能被多次啟動。線程被多次啟動會抛出異常:IllegalThreadStateException:非法的線程狀态異常

示例代碼如下:

關于多線程的幾道面試小題
關于多線程的幾道面試小題

1 package cn.itcast_02;
 2 
 3 /*
 4  * 該自定義的類為什麼要重寫run()方法?
 5  *         自定義類中不是所有的代碼都需要被線程執行。
 6  *         而這個時候,為了區分哪些代碼能夠被線程執行,java提供了Thread類中的run()方法,用來包含那些需要被線程執行的代碼。
 7  * 
 8  *         注意:這裡的  被線程執行 = 開一個新線程執行
 9  */
10 public class MyThread extends Thread {
11     // 不需要被線程執行的代碼
12     public void show() {
13         System.out.println("不需要被線程執行的代碼"); // 這麼簡單的程式去開一個新的線程,純屬浪費啊!
14     }
15     
16     // 需要被線程執行的代碼
17     @Override
18     public void run() {
19         // System.out.println("好好學習,天天向上"); // 這麼簡單的程式去開一個新的線程,純屬浪費啊!
20         
21         // 一般來說,被線程執行的代碼肯定是比較耗時的。
22         // 是以這裡示例:我們使用循環
23         for (int x = 0; x < 1000; x++) {
24             System.out.println(x);
25         }
26     }
27 
28 }      

MyThread.java

關于多線程的幾道面試小題
關于多線程的幾道面試小題
1 package cn.itcast_02;
 2 
 3 /*
 4  * 需求:我們要實作多線程的程式。
 5  * 
 6  * 如何通過java程式來實作多線程的程式呢?
 7  *         由于線程是依賴程序而存在的,是以我們應該先建立一個程序出來。
 8  *         而程序是由系統建立的,是以我們應該去調用系統功能建立一個程序。
 9  * 
10  *         而Java是不能直接調用系統功能的,是以,我們沒有辦法直接實作多線程程式。
11  *         但是呢?Java可以去調用C/C++寫好的程式來間接實作多線程程式。
12  * 
13  *         由C/C++程式去調用系統功能去建立程序,然後由Java進行封裝後,這樣會産生一些類,我們通過這些類建立的對象去調用他們即可!
14  * 
15  *         這樣我們就可以通過java程式來實作多線程程式了。
16  * 
17  * 那麼Java提供的類是什麼呢?
18  *         Thread類
19  *         通過檢視API,我們知道了有2種方式可以實作多線程程式。
20  *         (其實有三種方法,第三種明天講)
21  * 
22  * 方式1:繼承Thread類。
23  *         是将類聲明為 Thread 的子類。該子類應重寫 Thread 類的 run 方法。之後就可以配置設定并啟動該子類的執行個體了。
24  * 步驟
25  *         A:自定義類MyThread繼承Thread類
26  *         B:MyThread類裡面重寫run()方法
27  *         C:在測測試類中建立自定義類的對象(建立對象)
28  *         D:啟動線程
29  */
30 public class MyThreadDemo {
31     public static void main(String[] args) {
32         // 建立線程對象
33         // MyThread my = new MyThread();
34         // 啟動線程
35         // my.run();
36         // my.run();
37         
38         // 調用run()方法為什麼是單線程的呢?
39         // 因為run()方法直接調用其實就相當于普通的方法調用,是以你看到的是單線程的效果。
40         
41         // 要想看到多線程的效果,就必須說說另一個方法:start()
42         // 面試題:run()和start()的差別?
43         // run():僅僅是封裝被線程執行的代碼,直接調用就是普通方法。
44         // start():首先啟動了線程,然後再由jvm去調用該線程的run()方法。
45         
46         // MyThread my = new MyThread();
47         // my.start();
48         // my.start();
49         // IllegalThreadStateException:非法的線程狀态異常
50         // 為什麼呢?因為這個相當于是my線程被調用了兩次。而不是兩個線程被啟動。一個線程不能被多次啟動。
51 
52         // 建立兩個線程對象
53         MyThread my1 = new MyThread();
54         MyThread my2 = new MyThread();
55 
56         my1.start();
57         my2.start();
58     }
59 }      

MyThreadDemo.java

我的GitHub位址:

https://github.com/heizemingjun

我的部落格園位址:

http://www.cnblogs.com/chenmingjun

我的螞蟻筆記部落格位址:

http://blog.leanote.com/chenmingjun

Copyright ©2018 黑澤明軍

【轉載文章務必保留出處和署名,謝謝!】