Java線程——Thread

線程Thread

Java的線程對應(yīng)OS中的線程拇勃,相當于對OS線程的封裝
JVM中的線程

作用 線程
JVM的基本操作<br />如 自動內(nèi)存管理祭饭、取消偏向鎖<br />線程dump缀踪、線程掛起等 VM Thread
負責執(zhí)行定時操作 Periodic task Thread
負責垃圾回收 GC Thread
負責將字節(jié)碼編譯為本地代碼 Compiler Thread
負責響應(yīng)JVM外部信號 Singal Dispatcher Thread

Thread的成員變量

意義 成員變量 類型
線程ID tid long
線程序列數(shù) threadSeqNumber static long
線程名 name String
優(yōu)先級 priority int
是否守護線程 daemon boolean
要執(zhí)行的任務(wù) target Runnable
線程數(shù)組 group ThreadGroup
狀態(tài)碼<br />New虐译、Runnable雷酪、Bolcked、Waiting释涛、Timed_Waiting加叁、Terminated threadStatus int
線程對應(yīng)的本地變量map threadLocals ThreadLocal.ThreadLocalMap

Thread的成員函數(shù)

作用 API
創(chuàng)建線程 Thread(ThreadGroup group, Runnable target, String name, long stackSize)
啟動 start
強制結(jié)束 stop
等待線程結(jié)束 join
當前線程進入等待 sleep
調(diào)用run方法 run
線程讓步 yield
是否存活 isAlive
設(shè)置未捕獲異常處理器 setUncaughtExceptionHandler
獲取未捕獲異常 getUncaughtException

UncaughtExceptionHandler 未捕獲異常處理器,當線程發(fā)生非受檢異常而終止時唇撬,JVM調(diào)用線程未捕獲異常處理器的 uncaughtException方法

鉤子

使用Runtime類的addShutdownHook(Thread hook)添加
ApplicationShutdownHooks.add(hook)
IdentityHashMap<Thread,Thread> hooks.put(hook,hook)

源碼解析(native方法就不解析了)

創(chuàng)建

構(gòu)造函數(shù)調(diào)用init方法初始化線程

private void init(ThreadGroup g, Runnable target, String name,
                  long stackSize, AccessControlContext acc,
                  boolean inheritThreadLocals) {
    if (name == null) {
        throw new NullPointerException("name cannot be null");
    }

    this.name = name;

    Thread parent = currentThread();
    SecurityManager security = System.getSecurityManager();
    if (g == null) {
        //令securityManager獲取當前線程的ThreadGroup
        if (security != null) {
            g = security.getThreadGroup();
        }

        //自行獲取當前線程的ThreadGroup
        if (g == null) {
            g = parent.getThreadGroup();
        }
    }

    //確定權(quán)限——調(diào)用securityManager檢查當前線程組是否擁有RuntimePermission("modifyThreadGroup")權(quán)限
    g.checkAccess();

    //確定權(quán)限——RuntimePermission("enableContextClassLoaderOverride")
    if (security != null) {
        if (isCCLOverridden(getClass())) {
            security.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION);
        }
    }

    g.addUnstarted();

    this.group = g;
    this.daemon = parent.isDaemon();
    this.priority = parent.getPriority();
    if (security == null || isCCLOverridden(parent.getClass()))
        this.contextClassLoader = parent.getContextClassLoader();
    else
        this.contextClassLoader = parent.contextClassLoader;
    this.inheritedAccessControlContext =
        acc != null ? acc : AccessController.getContext();
    this.target = target;
    setPriority(priority);
    if (inheritThreadLocals && parent.inheritableThreadLocals != null)
        this.inheritableThreadLocals =
        ThreadLocal.createInheritedMap(parent.inheritableThreadLocals);
    /* Stash the specified stack size in case the VM cares */
    this.stackSize = stackSize;

    /* Set thread ID */
    tid = nextThreadID();
}

啟動

public synchronized void start() {
    //狀態(tài)必須為“NEW”
    if (threadStatus != 0)
        throw new IllegalThreadStateException();

    //添加至線程組
    group.add(this);

    boolean started = false;
    try {
        start0();
        started = true;
    } finally {
        try {
            if (!started) {
                group.threadStartFailed(this);
            }
        } catch (Throwable ignore) {
            /* do nothing. If start0 threw a Throwable then
                  it will be passed up the call stack */
        }
    }
}

private native void start0();

休眠

public static native void sleep(long millis) throws InterruptedException;

public static void sleep(long millis, int nanos)
    throws InterruptedException {
    if (millis < 0) {
        throw new IllegalArgumentException("timeout value is negative");
    }

    if (nanos < 0 || nanos > 999999) {
        throw new IllegalArgumentException(
            "nanosecond timeout value out of range");
    }

    if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
        millis++;
    }

    sleep(millis);
}

等待線程

public final synchronized void join(long millis)
    throws InterruptedException {
    long base = System.currentTimeMillis();
    long now = 0;

    if (millis < 0) {
        throw new IllegalArgumentException("timeout value is negative");
    }

    if (millis == 0) {
        while (isAlive()) {
            wait(0);
        }
    } else {
        while (isAlive()) {
            long delay = millis - now;
            if (delay <= 0) {
                break;
            }
            wait(delay);
            now = System.currentTimeMillis() - base;
        }
    }
}

讓步

public static native void yield();
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末它匕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子窖认,更是在濱河造成了極大的恐慌豫柬,老刑警劉巖告希,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異烧给,居然都是意外死亡燕偶,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門础嫡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杭跪,“玉大人,你說我怎么就攤上這事驰吓〗颍” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵檬贰,是天一觀的道長姑廉。 經(jīng)常有香客問我,道長翁涤,這世上最難降的妖魔是什么桥言? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮葵礼,結(jié)果婚禮上号阿,老公的妹妹穿的比我還像新娘。我一直安慰自己鸳粉,他們只是感情好扔涧,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著届谈,像睡著了一般枯夜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上艰山,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天湖雹,我揣著相機與錄音,去河邊找鬼曙搬。 笑死摔吏,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的纵装。 我是一名探鬼主播征讲,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼搂擦!你這毒婦竟也來了稳诚?” 一聲冷哼從身側(cè)響起哗脖,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瀑踢,失蹤者是張志新(化名)和其女友劉穎扳还,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體橱夭,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡氨距,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了棘劣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俏让。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖茬暇,靈堂內(nèi)的尸體忽然破棺而出首昔,到底是詐尸還是另有隱情,我是刑警寧澤糙俗,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布勒奇,位于F島的核電站,受9級特大地震影響巧骚,放射性物質(zhì)發(fā)生泄漏赊颠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一劈彪、第九天 我趴在偏房一處隱蔽的房頂上張望竣蹦。 院中可真熱鬧,春花似錦沧奴、人聲如沸痘括。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽远寸。三九已至,卻和暖如春屠凶,著一層夾襖步出監(jiān)牢的瞬間驰后,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工矗愧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留灶芝,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓唉韭,卻偏偏與公主長得像夜涕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子属愤,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容