大佬的理解->Java多線程(一)多線程基礎 大佬的理解->Java多線程(二)常用的實現多線程的兩種方式 1、繼承Thread類 繼承Thread必須重寫run方法,(具體業務執行方法,需要執行的業務方法,定義在此方法中),註意此方法是線程啟動後線程自動調用的; 案例 public class ...
大佬的理解->Java多線程(一)多線程基礎
大佬的理解->Java多線程(二)常用的實現多線程的兩種方式
1、繼承Thread類
繼承Thread必須重寫run方法,(具體業務執行方法,需要執行的業務方法,定義在此方法中),註意此方法是線程啟動後線程自動調用的;
案例
public class MyThread extends Thread{
@Override
public void run() {
//線程執行的業務方法
System.out.println("子線程執行");
for (int i = 0;i < 5;i++){
System.out.println("--- 線程名---:"+Thread.currentThread().getName()+",序號:"+i);
}
}
public static void main(String[] args) {
//主線程
System.out.println("***主線程執行***");
System.out.println("***線程名***:"+Thread.currentThread().getName());
//創建一個線程並啟動,只能通過主線程創建其他線程
MyThread thread1 = new MyThread();
MyThread thread2 = new MyThread();
//啟動線程:start()方法(一旦啟動,自動啟動子線程,當前線程繼續向下執行,不會等子線程)
thread1.start();
//啟動多線程
//多線程併發執行:不是正真一樣上的並行執行(肉眼感官是並行),而是通過cpu的調度演算法,有序cpu執行極快,所以肉眼看起來是並行的;
thread2.start();
//調用run方法,不可以啟動線程,就是對象的普通方法調用,等run方法執行結束,主線程才能繼續執行
//thread1.run();
System.out.println("----主線程執行結束----");
}
}
運行結果
***主線程執行***
***線程名***:main
----主線程執行結束----
子線程執行
--- 線程名---:Thread-0,序號:0
--- 線程名---:Thread-0,序號:1
--- 線程名---:Thread-0,序號:2
--- 線程名---:Thread-0,序號:3
--- 線程名---:Thread-0,序號:4
子線程執行
--- 線程名---:Thread-1,序號:0
--- 線程名---:Thread-1,序號:1
--- 線程名---:Thread-1,序號:2
--- 線程名---:Thread-1,序號:3
--- 線程名---:Thread-1,序號:4
註意start()方法和run()方法的區別
start():啟動線程start()方法(一旦啟動,自動啟動子線程,當前線程繼續向下執行,不會等子線程);
run() :調用run方法,不可以啟動線程,就是對象的普通方法調用,等run方法執行結束,主線程才能繼續執行;
2、實現Runnable介面
必須實現run方法;
案例
public class MyRunnable implements Runnable{
private int num = 5;
@Override
public void run() {
//線程執行的業務方法
System.out.println("子線程執行");
for (int i = 0;i < 5 ;i++){
if(num>0){
System.out.println("--- 線程名---:"+Thread.currentThread().getName()+",序號:"+num--);
}
}
}
public static void main(String[] args) {
//主線程
System.out.println("***主線程執行***");
System.out.println("***線程名***:"+Thread.currentThread().getName());
//創建一個子線程,並啟動
MyRunnable runnable1 = new MyRunnable();
//實現Runnable介面方式創建的線程,不能自己啟動,只能通過Thread類,將Runnable作為參數傳入Thread類的構造方法中,
// 構造線程對象,才可以啟動
Thread thread1 = new Thread(runnable1);
thread1.start();
//創建多線程 (如果傳入的Runnable參數一樣,可以共用資源)
Thread thread2 = new Thread(runnable1);
thread2.start();
System.out.println("----主線程執行結束----");
}
}
運行結果
***主線程執行***
***線程名***:main
----主線程執行結束----
子線程執行
子線程執行
--- 線程名---:Thread-0,序號:5
--- 線程名---:Thread-1,序號:4
--- 線程名---:Thread-0,序號:3
--- 線程名---:Thread-1,序號:2
--- 線程名---:Thread-0,序號:1
註意
如果傳入的Runnable參數一樣,可以共用資源;
3、比較兩種創建線程的方式
繼承Thread類
- 編寫簡單,可直接操作線程
- 適用於單繼承
實現Runnable介面
- 避免單繼承局限性
- 便於共用資源