-
方法一:繼承Thread類實現
1.創建一個類A,並繼承Thread類
2.重寫A的run()方法
3.創建A的實例對象b,即創建了線程對象
4.使用b調用start()方法:啟動線程(會自動調用run方法)
例如:
package 多線程;
/*
*1.創建兩個線程分別完成100以內奇數偶數的輸出
*/
public class CreateThread {
public static void main(String[] args){
Test1 t1 = new Test1();
Test2 t2 = new Test2();
t1.start();
t2.start();
}
}
//輸出偶數
class Test1 extends Thread {
@Override
public void run() {
for (int i = 0; i < 50; i++) {
if (i % 2 == 0) {
System.out.println("線程一輸出偶數:"+i);
}
}
}
}
//輸出奇數
class Test2 extends Thread{
@Override
public void run() {
for(int i =0; i < 50;i++){
if (i %2 != 0) {
System.out.println("線程二輸出奇數:"+i);
}
}
}
}
線程一輸出偶數:0
線程一輸出偶數:2
線程一輸出偶數:4
線程二輸出奇數:1
線程二輸出奇數:3
線程二輸出奇數:5
....
線程二輸出奇數:47
線程二輸出奇數:49
線程一輸出偶數:6
線程一輸出偶數:8
輸出結果省略了一部分,可以看出來,兩個線程的執行是交替的,所以奇數和偶數也是交替輸出.
-
方法二:實現Runnable接口
-
定義子類A,實現Runnable接口。
-
子類中重寫Runnable接口中的run方法。
-
通過Thread類含參構造器創建線程對象。
-
將Runnable接口的子類對象作為實際參數傳遞給Thread類的構造器中。
-
調用Thread類的start方法:開啟線程,調用Runnable子類接口的run方法。
-
例如:
package 多線程;
public class CreateThread2 {
public static void main(String[] args){
Test3 t3 = new Test3();
Test4 t4 = new Test4();
//多態性
Thread t = new Thread(t3);
Thread tt = new Thread(t4);
t.start();
tt.start();
}
}
//輸出偶數
class Test3 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 50; i++) {
if (i % 2 == 0) {
System.out.println("線程一輸出偶數:"+i);
}
}
}
}
//輸出奇數
class Test4 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 50; i++) {
if (i % 2 != 0) {
System.out.println("線程二輸出奇數:"+i);
}
}
}
}
//結果和上一個類似
-
注意事項
-
如果自己手動調用run()方法,那么就只是普通方法,沒有啟動多線程模式。
-
run()方法由JVM調用,什么時候調用,執行的過程控制都有操作系統的CPU 調度決定。
-
想要啟動多線程,必須調用start方法。
-
一個線程對象只能調用一次start()方法啟動,如果重復調用了,則將出現異常。
-
-
比較兩種方法
1.繼承Thread:線程代碼存放Thread子類run方法中。
2.實現Runnable:線程代碼存在接口的子類的run方法。
3.實現方式的好處:
①避免了單繼承的局限性
②多個線程可以共享同一個接口實現類的對象,非常適合多個相同線 程來處理同一份資源
-
說在最后
碼字不易,感謝支持。水平有限,難免錯漏和不准確,歡迎批評指正!