java線程學習記錄(一)

java中的線程使用

線程的定義

cpu調度的最小單位,一個進程每每由一個或多個線程組成,線程中的通訊容易同步複雜,線程崩潰可能會影響整個程序的穩定性,可靠性低。java

java中建立線程的方式

繼承Thread

案例ide

public class Demo01 {
    //繼承Thread類
    public static class MyThread extends Thread{
        //重寫run方法
        @Override
        public void run() {
            System.out.println("MyThread");
        }
    }
    public static void main(String[] args) {
        //實現
        Thread th=new MyThread();
        //啓動
        th.start();
    }
    
}

啓動過程:建立對象後,線程變成新建態,當調用start方法線程進入就緒態,得到cpu使用權後,線程進入運行態,執行完成後線程死亡。
異常分析:重複調用start則會拋出異常
image.png函數

實現Runnable接口

JDK源碼源碼分析

@FunctionalInterface
public interface Runnable {
    public abstract void run();
}

案例this

public class Demo02 {
    //實現Runnable接口
    public static class MyThread implements Runnable{
        //實現run方法
        @Override
        public void run() {
            // TODO Auto-generated method stub
            System.out.println("MyThread");
        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Thread th=new Thread(new MyThread());
        th.start();
    }
    
}

Thread源碼分析

JDK源碼spa

// Thread類源碼
// ⽚段1 - init⽅法
private void init(ThreadGroup g, Runnable target, String name,
 long stackSize, AccessControlContext acc,
boolean inheritThreadLocals)

// ⽚段2 - 構造函數調⽤init⽅法
public Thread(Runnable target) {
 init(null, target, "Thread-" + nextThreadNum(), 0);
}

// ⽚段3 - 使⽤在init⽅法⾥初始化AccessControlContext類型的私有屬性
this.inheritedAccessControlContext =
 acc != null ? acc : AccessController.getContext();
 
// ⽚段4 - 兩個對⽤於⽀持ThreadLocal的私有屬性
ThreadLocal.ThreadLocalMap threadLocals = null;
ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;

init方法中參數分析
ThreadGroup g:線程組,指定改線程歸屬於哪一個線程組
Runnable target:執行的任務
String name:線程名
acc:⽤於初始化私有變量 inheritedAccessControlContext。
inheritThreadLocals:可繼承的ThreadLocal線程

經常使用構造方法

//建立一個線程,參數能夠是一個實現Runnable接口的類
Thread(Runnable target)
//建立一個指定線程名的線程
Thread(Runnable target,String name)

Thread的經常使用方法

currentThread():靜態⽅法,返回對當前正在執⾏的線程對象的引⽤。
start():開始執行線程的方法,java虛擬機調用線程中的run方法。
sleep:靜態方法,讓線程睡眠,時間單位是毫秒,不會放棄對象鎖。
yield:中文意思放棄,會讓線程放棄cpu使用權,從運行態轉換爲就緒態,這⾥須要注意的是,就算當前線程調⽤了yield()
⽅法,程序在調度的時候,也還有可能繼續運⾏這個線程的。
join:使當前線程等待指定線程執行結束以後執行,內部調用Object的wait方法實現。code

Thread類與Runnable接口的比較

Runnable屬於接口,使用起來比Thread更加靈活。
Runnable更加符合面向對象,將線程進行單獨的封裝。
Runnable接口下降了線程對象和線程任務的耦合性。
Runnable沒有Thread那麼多的方法,更爲輕量。
在使用時Runnable接口的優先級更高。對象

相關文章
相關標籤/搜索