多線程:
* 計(jì)算機(jī)程序執(zhí)行原理
* CPU(寄存器,控制器,運(yùn)算器),內(nèi)存,硬盤(pán),光盤(pán)
* 程序,進(jìn)程,線程
* 程序:就是指我們寫(xiě)的保存在硬盤(pán)當(dāng)中的靜態(tài)文件叫程序
* 進(jìn)程:程序被加載進(jìn)內(nèi)存,準(zhǔn)備或者正在運(yùn)行的,就叫進(jìn)程
* 線程:就是程序中不同的執(zhí)行路徑
*
* 進(jìn)程:只要程序加載了,就會(huì)在操作系統(tǒng)注冊(cè)一個(gè)進(jìn)程號(hào)(PID)
*
* 程序代碼,在沒(méi)有被調(diào)用之前,都是以靜態(tài)文件方式保存在硬盤(pán)中的,我們調(diào)用的時(shí)候,就會(huì)從硬盤(pán)載入到內(nèi)存中
* 這個(gè)時(shí)候就認(rèn)為開(kāi)啟了一個(gè)進(jìn)程
* 進(jìn)程是一個(gè)操作系統(tǒng)的概念
*
* 線程:當(dāng)我們程序開(kāi)始執(zhí)行的時(shí)候,就是java中main()開(kāi)始執(zhí)行,在棧內(nèi)存開(kāi)辟main()棧幀的時(shí)候,就是開(kāi)啟了一個(gè)線程
* 一個(gè)線程就是里面的一個(gè)棧和鏈?zhǔn)綏?一個(gè)棧幀就對(duì)應(yīng)一個(gè)方法
* cpu時(shí)間片:Ghz:一秒鐘一億次,把5次執(zhí)行的時(shí)間當(dāng)成一個(gè)基本單位,這5次執(zhí)行的時(shí)間就是一個(gè)時(shí)間片
* 然后,給每個(gè)進(jìn)程不同的時(shí)間執(zhí)行,也許相同哦,誰(shuí)來(lái)決定是操作系統(tǒng)決定的
* 操作系統(tǒng)靠什么來(lái)決定:靠的是寫(xiě)程序的時(shí)候,給進(jìn)程指定的程序優(yōu)先級(jí)
* 為什么有多線程?
* 人的需求,可以多線程解決
* 因?yàn)橛卸嗪薈PU,需要提高程序的執(zhí)行效率
*
* 一切皆對(duì)象,那就是一切皆類(lèi)
/**
* 創(chuàng)建線程的第一種方式
* 第一步:繼承java.lang.Thread;
* 第二步:重寫(xiě)run(),為什么要重寫(xiě),因?yàn)閞un()就相當(dāng)于新線程中的main(),是程序執(zhí)行的起點(diǎn)和終點(diǎn)
*
* 三個(gè)要點(diǎn):
* 線程的定義:程序不同執(zhí)行路徑,從代碼的角度就是一個(gè)類(lèi),從內(nèi)存的角度就是一個(gè)新的棧,也就是一個(gè)新的棧幀鏈表
*
* 線程必須要先啟動(dòng):start();
*
* 一旦開(kāi)啟多線程,這個(gè)時(shí)候,說(shuō)代碼是從左到右,從上到下執(zhí)行這句話就不準(zhǔn)確了,因?yàn)?我們開(kāi)啟了兩個(gè)線程,在每個(gè)線程的內(nèi)部,仍然是從上到下,從左到右,但是線程之間的代碼,沒(méi)有固定的先后順序,他們執(zhí)行的先后順序是不確定的,和cpu操作系統(tǒng)和我們的設(shè)置都有關(guān)
* 第二種方法:
* 創(chuàng)建了一個(gè)Thread,實(shí)現(xiàn)java.lang.runnable,并實(shí)現(xiàn)了接口的run()方法
* 并且調(diào)用start();
* 不過(guò)不調(diào)用run();相當(dāng)于單線程
* 啟動(dòng)一個(gè)線程只能是,Thread類(lèi)的start();
*
* 創(chuàng)建新線程有兩種方法,但是啟動(dòng)只有一種方法,Thread的start();
/** 線程的生命周期:
* 我們的內(nèi)存分析圖,分析了一下單線程程序的生命周期,本質(zhì)是main()線程所在的棧生命周期,說(shuō)白了,也就是main()生命周期
* 非主線程的生命周期:
* run()本質(zhì)就是run()所在的棧的生命周期,也就run()方法的生命周期.
* 創(chuàng)建/激活
* 就緒
* 運(yùn)行--執(zhí)行/不執(zhí)行
* 阻塞
* 復(fù)活
* 死亡
*
* 線程類(lèi)的常用方法:
* setName();給線程取名字
* 不設(shè)置的話是Thread-0,依次累加
* getName();獲得當(dāng)前線程的名字
* static currentThread():獲得當(dāng)前線程的內(nèi)存地址
* static sleep():讓當(dāng)前的線程睡眠指定的毫秒數(shù)
*
* setPRiority():設(shè)置線程的優(yōu)先級(jí),
* java中線程的優(yōu)先級(jí)有0-10 11個(gè)級(jí)別
* win當(dāng)中是1-7 7個(gè)優(yōu)先級(jí)
* Unix:2^31;
* MIN_PRIORITY : 1
* MAX_PRIORITY : 10
* NORM_PRIORITY : 5
優(yōu)先級(jí)的等級(jí)默認(rèn)是5級(jí)
線程的合并:
對(duì)象名.join();//當(dāng)有join()的時(shí)候,誰(shuí)調(diào)用的就先輸出誰(shuí)的,相當(dāng)于方法的調(diào)用,不是線程的問(wèn)題了,變成了單線程問(wèn)題,又按照從上往下執(zhí)行
線程的讓位:
Thread.yield();
* 1 這是一個(gè)靜態(tài)方法,意味著即使用對(duì)象調(diào)用他,他也會(huì)低層轉(zhuǎn)化為類(lèi)名調(diào)用,聽(tīng)到的也是當(dāng)前類(lèi)偶在的線程,也就是說(shuō)在那個(gè)類(lèi)中調(diào)用,就停止那個(gè)類(lèi)的線程
* 2 給同一個(gè)優(yōu)先級(jí)的線程讓位,不同優(yōu)先級(jí)的不讓位
* 3 和sleep()方法相同,那個(gè)線程調(diào)用就停止那個(gè)類(lèi)的線程,但是沒(méi)時(shí)間,不固定,只是讓出當(dāng)前這個(gè)時(shí)間片,下一個(gè)時(shí)間片讓不讓另說(shuō)
* 現(xiàn)成的默認(rèn)優(yōu)先級(jí):
* 子線程默認(rèn)繼承父類(lèi)的優(yōu)先級(jí)
獲取優(yōu)先級(jí):
getPriority():調(diào)用這個(gè)方法,返回的是獲得的優(yōu)先級(jí)的等級(jí)數(shù)
先寫(xiě)一些基本的知識(shí)點(diǎn)和方法,尤其是前面的定義對(duì)多線程的理解很有幫助,只有理解了定義,才能更深一步的了解多線程,以后總結(jié)了更多的知識(shí)會(huì)即使和大家分享,希望對(duì)大家有幫助!
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注