線程系列(一)--基礎

基礎

1.什麼是線程
我也解釋不清,我們先知道它是一個可以獨立運行的單位,然後一個進程可以有多個線程並能多線程同時運行就行了。下面是百度百科解釋,有興趣可以看一下。
線程,有時被稱爲輕量級進程(Lightweight Process,LWP),是程序執行流的最小單元。一個標準的線程由線程ID,當前指令指針(PC),寄存器集合和堆棧組成。另外,線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點兒在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創建和撤消另一個線程,同一進程中的多個線程之間可以併發執行。
2.怎樣使用線程
一種:繼承Thread,重寫run()
另一種:實現Runnable接口並把此對象傳給Thread的構造函數

Thread

好啦,那我就來看看Runnable和Thread這兩個類吧

Runnable其實就是一個接口,裏面就一個run方法
public interface Runnable {
    public void run();
}
Thread就複雜許多,在實現Runnable接口的基礎上做了許多其它操作,只複製目前我所明白的代碼。
public class Thread implements Runnable {
//下面這些屬性定好了,我們就不要去更改他們的值
    private volatile long nativePeer;
    volatile ThreadGroup group;//線程所在的組
    volatile String name;//線程名字
    volatile int priority;//優先級
    volatile long stackSize; //線程的堆大小,This has a highly platform-dependent interpretation. It may even be ignored completely.說什麼這個值與平臺相關,自己設置可能也會不起作用,覺得翻譯有誤,英文好的或者理解了它的可以說一下。
    Runnable target;
    private static int count = 0;
    private long id;//線程id,唯一標識,根據上面那個count屬性值得到
    public enum State { //線程狀態
        //線程被創建但還沒start        
        NEW,
        //The thread may be run.
        RUNNABLE,
        //線程被阻塞,正在等待鎖      
        BLOCKED,
        //等待
        WAITING,
        // 線程根據一個指定的時間在等待
        TIMED_WAITING,
        //線程終止
        TERMINATED
    }
//構造方法很多,寫一個參數最多的
public Thread(ThreadGroup group, Runnable runnable, String threadName, long stackSize) {
        if (threadName == null) {
            throw new NullPointerException("threadName == null");
        }
        //除一個特殊的構造方法,其餘都是這樣子去調用create(),但意思都差不多,初始化那些屬性
        create(group, runnable, threadName, stackSize);
    }
    /**
     * 實現Runnable的run(),如果線程有Runnable對象就運行它的run()沒有就啥都不幹。
     */
public void run() {
        if (target != null) {
            target.run();
        }
    }
    /**
     * 開啓一個新線程,運行裏面的run方法,
     * @throws IllegalThreadStateException 如果當前線程已經啓動再調用就會拋此異常
     */
public synchronized void start() {···}
    /**
     * 有兩個重載方法,還有一個是隻有毫秒級別的,迫使發送這個消息的線程休息指定了的時長。
     * @param millis 毫秒
     * @param nanos 納秒
     * @throws InterruptedException 如果當前線程已經被中斷了就拋出InterruptedException,在異常拋出之前當前線程的中斷狀態獎盃清楚掉。
     */
public static void sleep(long millis, int nanos) throws InterruptedException {···}
    /**
     *跟sleep類似,有三個重載方法。區別在於它指當前線程暫停,直到調用此方法的那個線程方法執行完並結束,或者超過了我們給定的時長。滿足任何一條當前線程就會甦醒。
     */
public final void join(long millis, int nanos) throws InterruptedException {···}
    /**
     *給線程發送一箇中斷請求,並且這個行爲是依賴於這個線程的狀態State
     *當線程處於等待鎖的狀態是無法被中斷的,需要我們捕獲InterruptedException操作推出run()方法。而對於不能捕獲這個異常的,可以用這兩個方法interrupted() isInterrupted()
     */
 public void interrupt() {···}
    /**
     * 靜態方法,查看當前線程自己是否有即將中斷的請求,並會消除中斷標誌
     */
 public static native boolean interrupted();
    /**
     * 常用於一個線程查看另一個線程的中斷狀態,並不會消除中斷標誌
     */
public native boolean isInterrupted();
    /**
     * 迫使一個calling線程的運行時間屈服與另一個線程的運行時間,爲了實現依賴,我不懂。
     */
public static native void yield();

總結一下:
start()啓動線程運行run();
sleep()和join()暫停線程;
interrupt()中斷線程;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章