package cn.itcast_02;
/*
* 需求:我們要實作多線程的程式。
* 如何實作呢?
* 由于線程是依賴程序而存在的,是以我們應該先建立一個程序出來。
* 而程序是由系統建立的,是以我們應該去調用系統功能建立一個程序。
* Java是不能直接調用系統功能的,是以,我們沒有辦法直接實作多線程程式。
* 但是呢?Java可以去調用C/C++寫好的程式來實作多線程程式。
* 由C/C++去調用系統功能建立程序,然後由Java去調用這樣的東西,
* 然後提供一些類供我們使用。我們就可以實作多線程程式了。
* 那麼Java提供的類是什麼呢?
* Thread
* 通過檢視API,我們知道了有2種方式實作多線程程式。
*
* 方式1:繼承Thread類。
* 步驟:
* A:自定義類MyThread繼承Thread類。
* B:MyThread類裡面寫run()?
* 為什麼是run()方法呢?
* C:建立對象
* D:啟動線程
*/
public class MyThreadDemo {
public static void main(String[] args) {
// 建立線程對象
// MyThread my = new MyThread();
// 啟動線程
// my.run();
// my.run();
// 調用run()方法為什麼是單線程的呢?
// 因為run()方法直接調用其實就相當于普通的方法調用,是以你看到的是單線程的效果
// 要想看多線程的效果,就必須說說别一個方法:start()
// 面試題:run()和start()的差別?
// run()僅僅是封裝被執行的代碼,直接調用是普通方法。
// start():首先啟動了線程,然後再由jvm調用該線程的run()方法。
// MyThread my = new MyThread();
// my.start();
// IllegalThreadStateException:非法的線程狀态異常
// 為什麼呢?因為這個相當于my線程被調用了兩次,而不是兩個線程啟動。
// my.start();
// 建立兩個線程對象
MyThread my1 = new MyThread();
MyThread my2 = new MyThread();
my1.start();
my2.start();
}
}
package cn.itcast_02;
/*
* 該類要重寫run()方法,為什麼呢?
* 不是類中的所有代碼都需要被線程執行的。
* 而這個時候,為了區分哪些代碼能夠被線程執行,java提供了Thread類中的run()用來包含那些被線程執行的代碼。
*/
public class MyThread extends Thread {
@Override
public void run() {
// 自已寫代碼
// System.out.println("天天向上,好好學習");
// 一般來說,被線程執行的代碼肯定是比較耗時的。是以我們用循環改進
for (int x = 0; x < 30; x++) {
System.out.println(x);
}
}
}