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