線程基礎筆記

package cn.galc.test;
import java.util.*;
public class TestThread3 {
    public static void main(String args[]){
        MyThread thread = new MyThread();
        thread.start();//調用start()方法啓動新開闢的線程
        try {
            /*Thread.sleep(10000);
            sleep()方法是在Thread類裏面聲明的一個靜態方法,因此可以使用Thread.sleep()的格式進行調用
            */
            /*MyThread.sleep(10000);
            MyThread類繼承了Thread類,自然也繼承了sleep()方法,所以也可以使用MyThread.sleep()的格式進行調用
            */
            /*靜態方法的調用可以直接使用“類名.靜態方法名”
              或者“對象的引用.靜態方法名”的方式來調用*/
            MyThread.sleep(10000);
            System.out.println("主線程睡眠了10秒種後再次啓動了");
            //在main()方法裏面調用另外一個類的靜態方法時,需要使用“靜態方法所在的類.靜態方法名”這種方式來調用
            /*
            所以這裏是讓主線程睡眠10秒種
            在哪個線程裏面調用了sleep()方法就讓哪個線程睡眠,所以現在是主線程睡眠了。
            */
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //thread.interrupt();//使用interrupt()方法去結束掉一個線程的執行並不是一個很好的做法
        thread.flag=false;//改變循環條件,結束死循環
        /**
         * 當發生InterruptedException時,直接把循環的條件設置爲false即可退出死循環,
         * 繼而結束掉子線程的執行,這是一種比較好的結束子線程的做法
         */
        /**
         * 調用interrupt()方法把正在運行的線程打斷
        相當於是主線程一盆涼水潑上去把正在執行分線程打斷了
        分線程被打斷之後就會拋InterruptedException異常,這樣就會執行return語句返回,結束掉線程的執行
        所以這裏的分線程在執行完10秒鐘之後就結束掉了線程的執行
         */
    }
}


class MyThread extends Thread {
    boolean flag = true;// 定義一個標記,用來控制循環的條
    public void run() {
        /*
         * 注意:這裏不能在run()方法的後面直接寫throw Exception來拋異常, 
         * 因爲現在是要重寫從Thread類繼承而來的run()方法,重寫方法不能拋出比被重寫的方法的不同的異常。
         *  所以這裏只能寫try……catch()來捕獲異常
         */
        while (flag) {
            System.out.println("==========" + new Date().toLocaleString() + "===========");
            try {
                /*
                 * 靜態方法的調用格式一般爲“類名.方法名”的格式去調用 在本類中聲明的靜態方法時調用時直接寫靜態方法名即可。 當然使用“類名.方法名”的格式去調用也是沒有錯的
                 */
                // MyThread.sleep(1000);//使用“類名.方法名”的格式去調用屬於本類的靜態方法
                sleep(1000);//睡眠的時如果被打斷就會拋出InterruptedException異常
                // 這裏是讓這個新開闢的線程每隔一秒睡眠一次,然後睡眠一秒鐘後再次啓動該線程
                // 這裏在一個死循環裏面每隔一秒啓動一次線程,每個一秒打印出當前的系統時間
            } catch (InterruptedException e) {
                /*
                 * 睡眠的時一盤冷水潑過來就有可能會打斷睡眠 
                 * 因此讓正在運行線程被一些意外的原因中斷的時候有可能會拋被打擾中斷(InterruptedException)的異常
                 */
                return;
                // 線程被中斷後就返回,相當於是結束線程
            }
        }
    }
}

package cn.galc.test;

public class TestThread4 {
    public static void main(String args[]) {
        MyThread2 thread2 = new MyThread2("mythread");
        // 在創建一個新的線程對象的同時給這個線程對象命名爲mythread
        thread2.start();// 啓動線程
        try {
            thread2.join();// 調用join()方法合併線程,將子線程mythread合併到主線程裏面
            // 合併線程後,程序的執行的過程就相當於是方法的調用的執行過程
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        for (int i = 0; i <= 5; i++) {
            System.out.println("I am main Thread");
        }
    }
}


class MyThread2 extends Thread {
    MyThread2(String s) {
        super(s);
        /*
         * 使用super關鍵字調用父類的構造方法 
         * 父類Thread的其中一個構造方法:“public Thread(String name)” 
         * 通過這樣的構造方法可以給新開闢的線程命名,便於管理線程
         */
    }


    public void run() {
        for (int i = 1; i <= 5; i++) {
            System.out.println("I am a\t" + getName());
            // 使用父類Thread裏面定義的
            //public final String getName(),Returns this thread's name.
            try {
                sleep(1000);// 讓子線程每執行一次就睡眠1秒鐘
            } catch (InterruptedException e) {
                return;
            }
        }
    }
}


發佈了13 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章