Thread -線程的兩種創建方式


package cn.learn.thread.Thread;
/*
    實現Runnable必須重寫run()方法,一般推薦用Runnable實現

 */
public class RunnableImpl implements Runnable {

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"執行");
    }
}
package cn.learn.thread.Thread;
/*
     繼承Thread類,實現多線程
     實現步驟:
        1.創建一個Thread類的子類
        2.在Thread的子類中重寫Thread類中的run方法設置線程任務
        3.創建Thread的子類對象
        4.調用Thread類中的start方法,開啟新的線程,執行run方法
        結果是兩個線程並發地運行,當前線程(main線程)和另外一個線程(執行其run方法)
        多次啟動一個線程是非法的,特別線程結束后,不能重新啟動
     java屬於搶占式執行,哪個線程級別高就優先執行;同一個優先級隨機選擇

 */
public class ThreadExtends extends Thread {

    public ThreadExtends() {
    }

    //使用父類來創建新線程名稱
    public ThreadExtends(String name) {
        super(name);
    }

    //重新run方法
    @Override
    public void run() {
        //獲取線程名稱
        //String name = this.getName();
        //System.out.println("線程名稱:"+name);

        //獲取當前線程名稱
        Thread thr = Thread.currentThread();
        System.out.println(thr);

        //鏈式編程
        //System.out.println(Thread.currentThread().getName());
    }
}
 1 package cn.learn.thread.Thread;
 2 /*
 3     JVM執行main方法,找OS開辟一條main方法通向cpu的路徑
 4     這個路徑叫main線程-主線程
 5     cpu通過該線程,路徑就可以執行main方法
 6 
 7     Thread繼承與Runnable接口實現的區別
 8     實現Runnable接口創建多線程的好處:
 9       1.避免了單繼承的局限性
10       2.增強了程序的擴展性,降低了耦合性(解耦),eg:多個Runnable的實現類可以有不同的線程任務
11       3.多個Thread對象,共用一個Runnable實現類對象的資源
12  */
13 
14 public class MyThread {
15     public static void main(String[] args) throws InterruptedException {
16         //創建Thread類的子類對象,如ThreadExtends有構造方法可在其類用super(name)父類來創建線程名稱
17         ThreadExtends anThread = new ThreadExtends();
18 
19         //可以用anThread.setName();來設置線程名稱
20 
21         //開辟新線程,用於執行run方法,如果直接使用run方法,還是單線程,由main方法來執行
22         anThread.start(); //開辟新的棧空間,新線程,ThreadExtends類中run方法運行,獲取線程名稱Thread-0
23 
24         //再創建一個新線程,運行run(),獲取線程名稱Thread-1
25         new ThreadExtends().start();  //Thread[Thread-1,5,main]
26 
27         //獲取當前線程名稱
28         System.out.println(Thread.currentThread().getName());  //main
29 
30         //與上面的線程並發執行,不安全,搶占cpu,cpu有選擇的權利,隨機執行
31         for (int i = 0; i <10 ; i++) {
32             System.out.println("main"+i);
33         }
34 
35 
36         //Thread的sleep暫時以指定毫秒數停止執行線程,結束后繼續執行
37         //模擬秒表
38         for (int i = 0; i <60 ; i++) {
39             Thread.currentThread().sleep(1000);
40             System.out.println(i);
41 
42         }
43 
44 
45         //創建線程的第二種方法
46         /*
47         創建線程的另一種方法是聲明實現 Runnable 接口的類。
48         該類然后實現 run 方法。然后可以分配該類的實例,在創建 Thread 時作為一個參數來傳遞並啟動。
49 
50         需要用Thread來接受其對象,調用start,運行run開啟新線程
51         */
52         //1
53         RunnableImpl runnableThread = new RunnableImpl();
54         //2,多個Thread共用一個runnableThread資源
55         Thread t=new Thread(runnableThread);
56         Thread t1=new Thread(runnableThread);
57         //3
58         t.start();  //新線程開啟
59         t1.start();  //新線程開啟
60 
61     }
62 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM