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/chenmingjunCopyright ©2018 黑澤明軍
【轉載文章務必保留出處和署名,謝謝!】