线程的创建
進(jìn)程:就是正在運(yùn)行的程序 ?(一個進(jìn)程可以有多個線程),分配內(nèi)存讓應(yīng)用程序能夠運(yùn)行。
Windows系統(tǒng)號稱多任務(wù)(可以同時運(yùn)行多個應(yīng)用程序)
? 宏觀上看:Windows確實(shí)運(yùn)行了多個程序
? 圍觀上看:cpu快速做了切換操作,快速執(zhí)行任務(wù)
線程:線程就是在一個進(jìn)程中負(fù)責(zé)代碼的執(zhí)行,就是一個進(jìn)程中的執(zhí)行路徑
java程序在運(yùn)行的時候,java虛擬機(jī)會幫我們創(chuàng)建一個主線程來執(zhí)行代碼,主線程主要負(fù)責(zé)main里面的代碼
一個java程序里面,至少有兩個線程,一個是主線程,主要負(fù)責(zé)main方法的執(zhí)行,另外一個是垃圾回收器線程,主要負(fù)責(zé)垃圾回收
多線程:在一個進(jìn)程中,多個線程同時執(zhí)行不同的任務(wù),(就是單核cpu在做快速的切換,多個線程執(zhí)行任務(wù))
多線程的好處:
? ? ?1.可以解決一個進(jìn)程中同事執(zhí)行多個任務(wù)的問題
? ? ?2.提高資源的利用率
多線程的弊端:
? ? ?1.增加cpu的負(fù)擔(dān),不是線程越多越好
? ? ?2.降低了一個進(jìn)程中線程的執(zhí)行
? ? ?3.容易引發(fā)線程安全問題
? ? ?4.容易出現(xiàn)死鎖
java中創(chuàng)建線程有兩種方式:
? ? 方式一: Thread (線程類)
? ? ? ? ? ? ? ? ?1.需要定義一個類來繼承Thread類
? ? ? ? ? ? ? ? ?2.重寫Thread類中的run方法,把自定義線程的任務(wù)代碼寫在run方法中,每一個線程都有自己的任務(wù)代碼,java虛擬機(jī)創(chuàng)建的主線程的任務(wù)代碼就是main方法,自定義的線程的任務(wù)代碼就寫下run方法中,自定義的線程就需要來執(zhí)行run方法中的代碼
? ? ? ? ? ? ? ? ?3.創(chuàng)建Thread的子類,并且調(diào)用start方法開啟線程
? ? ? ? ? ? ? ? ?注意點(diǎn):一旦線程開啟了,會默認(rèn)執(zhí)行線程對象中的run方法,但是千萬不要自己直接調(diào)用run方法,如果直接調(diào)用run方法,就和普通的方法沒有區(qū)別
線程的生命周期:
? ? ? ? 創(chuàng)建線程(new子線程類)——>等待運(yùn)行狀態(tài)(只有cpu的等待資格,沒有執(zhí)行)——>運(yùn)行狀態(tài)(具備cpu的執(zhí)行權(quán),具備cpu的等待權(quán))
?——>結(jié)束
線程如果執(zhí)行sleep或者wait方法,那么這個時候線程會處于阻塞狀態(tài),如果是sleep方法,如果超過了睡眠時間線程會立馬進(jìn)入等待運(yùn)行狀態(tài),如果是wait,需要通過其他的線程來喚醒
線程常用的方法:
? ? ?Thread (String name)初始化線程名字
? ? ? getName() ? ? ? ? ? ? ? 返回線程的名字
? ? ? setName(String name)設(shè)置線程對象名字
? ? ? sleep() ? ? ? ? ? ? ? ? ? ? ? 線程睡眠指定毫秒數(shù)
? ? ? getPriority ? ? ? ? ? ? ? ? ? ? 獲取主線程的優(yōu)先級,默認(rèn)線程的優(yōu)先級是5,
? ? ? setPriority(int newPriority)設(shè)置線程的優(yōu)先級,雖然設(shè)置了線程的優(yōu)先級,但是具體的實(shí)現(xiàn)取決于底層的操作系統(tǒng)的實(shí)現(xiàn)(最大的優(yōu)先級是10,最小的優(yōu)先級是1,一般默認(rèn)是5)
? ? ? ?currentThread()返回cpu正在執(zhí)行的線程對象
出現(xiàn)了線程安全問題,數(shù)據(jù)操作不安全
? ? ?java給線程枷鎖:?
? ? ? ? 方式一:同步代碼塊
? ? ? ? ?所對象可以是人任意一個java中的對象 ? ? ?java中的任意一個對象,都會有一個對象的狀態(tài),,就可以通過對象的狀態(tài)來作為鎖的一個標(biāo)識符,statue ?= ?0 ,表示鎖是關(guān)閉的 ?statue ?= ?1,表示鎖打開的
? ? ? ? ? ?synchronized(鎖對象){
? ? ? ? ? ??
? ? ? ? ? ?}
? ? ? ? 同步代碼塊的使用注意點(diǎn):
? ? ? ? 1.任意一個對象都可以做鎖對象
? ? ? ? 2.如果你在同步代碼塊中調(diào)用了sleep方法,不會釋放鎖對象
? ? ? ? 3.只有真正的存在線程安全的時候才需要使用同步代碼塊的方法,否則會降低執(zhí)行效率
? ? ? ? 4.多線程操作鎖對象必須是唯一的,否則無效
出現(xiàn)線程安全問題根本原因:
? ? ? ? 1.存在兩個或兩個以上的線程,并且線程之間共享看一個資源
? ? ? ? 2.多個語句操作共享資源
方式二:同步函數(shù),用關(guān)鍵字synchronized 修飾函數(shù):
? ? ? ? ? ? 同步函數(shù)有鎖方法,
? ? ? ? ? ? 同步函數(shù)注意點(diǎn):
? ? ? ? ? ? ? ? 1.如果是一個非靜態(tài)的函數(shù),同步函數(shù)的鎖對象就是調(diào)用方法的對象(this對象),如果是一個靜態(tài)函數(shù)同步函數(shù)的鎖對象,是當(dāng)前函數(shù)所屬類的字節(jié)碼(class 對象)
? ? ? ? ? ? ? ? 2.同步函數(shù)的鎖對象固定,不能夠自己來指定
? ? ? ? ? ? ? ? 3.同步函數(shù)是同步整個函數(shù)的代碼。
推薦使用:同步代碼塊
? ?原因:
? ? 1.同步代碼塊的鎖對象可以由我任意指定,同步函數(shù)是固定的
? ? 2.同步代碼塊可以控制同步的范圍,同步函數(shù)必須是整個函數(shù)的所有代碼都被同步
代碼同步是可以解決線程安全問題,但是如果使用不當(dāng)會導(dǎo)致線程死鎖問題
?A線程等B線程 B有要等A線程,兩個人就等到一起了 ?或造成死鎖的
線程的定義方式二:
? ? ?1. 定義一個類實(shí)現(xiàn)Runable接口,接口就會提供一個run方法
? ? ?2.實(shí)現(xiàn)Runbale接口的run方法,將線程中的任務(wù)寫在run方法中
? ? ?3.創(chuàng)建RUnbale接口的實(shí)現(xiàn)類對象
? ? ?4.創(chuàng)建一個Thread對象,并把Runable實(shí)現(xiàn)類的創(chuàng)建的對象做為參數(shù)
? ? ?5.調(diào)用Thread對象的start方法開啟線程
問題: ?為什么要將Runable接口實(shí)現(xiàn)類的對象做為參數(shù)傳遞?
? ? ? ?為了讓對象中的run方法能夠在線程中的run方法中執(zhí)行,也就是能夠?qū)ο笾械膔un方法做為線程中的任務(wù)來執(zhí)行
線程的通訊:一個線程完成自己的任務(wù);去通知另外一個線程完成另外一個任務(wù)
wait();等待 ?如果線程執(zhí)行了wait方法,那么該線程就會處于一個等待狀態(tài),等待狀態(tài)的線程必須要通過其他線程來調(diào)用
? ? ? ? ? ? ? notify()方法來喚醒
notify();喚醒 隨機(jī)喚醒一個
notifyAll();喚醒所有的等待
? ?1.wait方法和notify方法是屬性object對象
? ?2.wait方法和notify方法必須在同步線程中執(zhí)行
? ?3.wait方法和notify方法必須有所對象來調(diào)用
?
轉(zhuǎn)載于:https://www.cnblogs.com/2016yjl/p/6126492.html
總結(jié)
- 上一篇: 黑发不知勤学早,白首方悔读书迟———颜真
- 下一篇: nginx https ssl 配置