您好,登錄后才能下訂單哦!
介紹多線程之前要介紹線程,介紹線程則離不開(kāi)進(jìn)程。
首先進(jìn)程 :是一個(gè)正在執(zhí)行中的程序,每一個(gè)進(jìn)程執(zhí)行都有一個(gè)執(zhí)行順序,該順序是一個(gè)執(zhí)行路徑,或者叫一個(gè)控制單元;
線程:就是進(jìn)程中的一個(gè)獨(dú)立控制單元,線程在控制著進(jìn)程的執(zhí)行。一個(gè)進(jìn)程中至少有一個(gè)進(jìn)程。
多線程:一個(gè)進(jìn)程中不只有一個(gè)線程。
為什么要用多線程:
新建 :從新建一個(gè)線程對(duì)象到程序start() 這個(gè)線程之間的狀態(tài),都是新建狀態(tài);
就緒 :線程對(duì)象調(diào)用start()方法后,就處于就緒狀態(tài),等到JVM里的線程調(diào)度器的調(diào)度;
運(yùn)行 :就緒狀態(tài)下的線程在獲取CPU資源后就可以執(zhí)行run(),此時(shí)的線程便處于運(yùn)行狀態(tài),運(yùn)行狀態(tài)的線程可變?yōu)榫途w、阻塞及死亡三種狀態(tài)。
等待/阻塞/睡眠 :在一個(gè)線程執(zhí)行了sleep(睡眠)、suspend(掛起)等方法后會(huì)失去所占有的資源,從而進(jìn)入阻塞狀態(tài),在睡眠結(jié)束后可重新進(jìn)入就緒狀態(tài)。
終止 :run()方法完成后或發(fā)生其他終止條件時(shí)就會(huì)切換到終止?fàn)顟B(tài)。
步驟: 、定義類(lèi)繼承Thread;
目的:將自定義代碼存儲(chǔ)在run方法,讓線程運(yùn)行
該方法有兩步:?jiǎn)?dòng)線程,調(diào)用run方法。
實(shí)現(xiàn)步驟: 、定義類(lèi)實(shí)現(xiàn)Runnable接口
實(shí)現(xiàn)步驟:
繼承Thread:線程代碼存放在Thread子類(lèi)run方法中。
實(shí)現(xiàn)Runnable:線程代碼存放在接口的子類(lèi)的run方法中。
實(shí)現(xiàn)Callable:
線程睡眠的原因:線程執(zhí)行的太快,或需要強(qiáng)制執(zhí)行到下一個(gè)線程。
線程睡眠的方法(兩個(gè)):sleep(long millis)在指定的毫秒數(shù)內(nèi)讓正在執(zhí)行的線程休眠。
sleep(long millis,int nanos)在指定的毫秒數(shù)加指定的納秒數(shù)內(nèi)讓正在執(zhí)行的線程休眠。
線程睡眠的代碼演示:
public class SynTest {
public static void main(String[] args) {
new Thread(new CountDown(),"倒計(jì)時(shí)").start();
}
}
class CountDown implements Runnable{
int time = 10;
public void run() {
while (true) {
if(time>=0){
System.out.println(Thread.currentThread().getName() + ":" + time--);
try {
Thread.sleep(1000);
//睡眠時(shí)間為1秒
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
每隔一秒則會(huì)打印一次,打印結(jié)果為:
倒計(jì)時(shí):10
倒計(jì)時(shí):9
倒計(jì)時(shí):8
倒計(jì)時(shí):7
倒計(jì)時(shí):6
倒計(jì)時(shí):5
倒計(jì)時(shí):4
倒計(jì)時(shí):3
倒計(jì)時(shí):2
倒計(jì)時(shí):1
倒計(jì)時(shí):0
擴(kuò)展:
Java線程調(diào)度是Java多線程的核心,只有良好的調(diào)度,才能充分發(fā)揮系統(tǒng)的性能,提高程序的執(zhí)行效率。但是不管程序員怎么編寫(xiě)調(diào)度,只能最大限度的影響線程執(zhí)行的次序,而不能做到精準(zhǔn)控制。因?yàn)槭褂胹leep方法之后,線程是進(jìn)入阻塞狀態(tài)的,只有當(dāng)睡眠的時(shí)間結(jié)束,才會(huì)重新進(jìn)入到就緒狀態(tài),而就緒狀態(tài)進(jìn)入到運(yùn)行狀態(tài),是由系統(tǒng)控制的,我們不可能精準(zhǔn)的去干涉它,所以如果調(diào)用Thread.sleep(1000)使得線程睡眠1秒,可能結(jié)果會(huì)大于1秒。
同步的前提:
如何找問(wèn)題?
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。