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