Java 給多線程編程提供了內(nèi)置的支持。 一條線程指的是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程并行執(zhí)行不同的任務(wù)。
成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括吳興網(wǎng)站建設(shè)、吳興網(wǎng)站制作、吳興網(wǎng)頁制作以及吳興網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,吳興網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到吳興省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
新建狀態(tài):
使用 new 關(guān)鍵字和 Thread 類或其子類建立一個(gè)線程對象后,該線程對象就處于新建狀態(tài)。它保持這個(gè)狀態(tài)直到程序 start() 這個(gè)線程。
就緒狀態(tài):
當(dāng)線程對象調(diào)用了start()方法之后,該線程就進(jìn)入就緒狀態(tài)。就緒狀態(tài)的線程處于就緒隊(duì)列中,要等待JVM里線程調(diào)度器的調(diào)度。
運(yùn)行狀態(tài):
如果就緒狀態(tài)的線程獲取 CPU 資源,就可以執(zhí)行 run(),此時(shí)線程便處于運(yùn)行狀態(tài)。處于運(yùn)行狀態(tài)的線程最為復(fù)雜,它可以變?yōu)樽枞麪顟B(tài)、就緒狀態(tài)和死亡狀態(tài)。
阻塞狀態(tài):
如果一個(gè)線程執(zhí)行了sleep(睡眠)、suspend(掛起)等方法,失去所占用資源之后,該線程就從運(yùn)行狀態(tài)進(jìn)入阻塞狀態(tài)。在睡眠時(shí)間已到或獲得設(shè)備資源后可以重新進(jìn)入就緒狀態(tài)。可以分為三種:
等待阻塞:運(yùn)行狀態(tài)中的線程執(zhí)行 wait() 方法,使線程進(jìn)入到等待阻塞狀態(tài)。
同步阻塞:線程在獲取 synchronized 同步鎖失敗(因?yàn)橥芥i被其他線程占用)。
其他阻塞:通過調(diào)用線程的 sleep() 或 join() 發(fā)出了 I/O 請求時(shí),線程就會進(jìn)入到阻塞狀態(tài)。當(dāng)sleep() 狀態(tài)超時(shí),join() 等待線程終止或超時(shí),或者 I/O 處理完畢,線程重新轉(zhuǎn)入就緒狀態(tài)。
死亡狀態(tài):
一個(gè)運(yùn)行狀態(tài)的線程完成任務(wù)或者其他終止條件發(fā)生時(shí),該線程就切換到終止?fàn)顟B(tài)。
這個(gè)沒辦法實(shí)現(xiàn)的。
如果是一小段代碼,那么只能說是順序執(zhí)行代碼中的內(nèi)容(java代碼是順序執(zhí)行的)。
如果是想多個(gè)線程同時(shí)跑多次這段代碼,那么每次創(chuàng)建一個(gè)線程,之后直接通過方法調(diào)用這段代碼即可。
多線程:指的是這個(gè)程序(一個(gè)進(jìn)程)運(yùn)行時(shí)產(chǎn)生了不止一個(gè)線程
并行與并發(fā):
并行:多個(gè)cpu實(shí)例或者多臺機(jī)器同時(shí)執(zhí)行一段處理邏輯,是真正的同時(shí)。
并發(fā):通過cpu調(diào)度算法,讓用戶看上去同時(shí)執(zhí)行,實(shí)際上從cpu操作層面不是真正的同時(shí)。并發(fā)往往在場景中有公用的資源,那么針對這個(gè)公用的資源往往產(chǎn)生瓶頸,我們會用TPS或者QPS來反應(yīng)這個(gè)系統(tǒng)的處理能力。
線程安全:經(jīng)常用來描繪一段代碼。指在并發(fā)的情況之下,該代碼經(jīng)過多線程使用,線程的調(diào)度順序不影響任何結(jié)果。這個(gè)時(shí)候使用多線程,我們只需要關(guān)注系統(tǒng)的內(nèi)存,cpu是不是夠用即可。反過來,線程不安全就意味著線程的調(diào)度順序會影響最終結(jié)果,如不加事務(wù)的轉(zhuǎn)賬代碼:
請點(diǎn)擊輸入圖片描述
同步:Java中的同步指的是通過人為的控制和調(diào)度,保證共享資源的多線程訪問成為線程安全,來保證結(jié)果的準(zhǔn)確。如上面的代碼簡單加入@synchronized關(guān)鍵字。在保證結(jié)果準(zhǔn)確的同時(shí),提高性能,才是優(yōu)秀的程序。線程安全的優(yōu)先級高于性能。
要說線程,就必須先說說進(jìn)程,進(jìn)程就是程序的運(yùn)行時(shí)的一個(gè)實(shí)例。線程呢可以看作單獨(dú)地占有CPU時(shí)間來執(zhí)行相應(yīng)的代碼的。對早期的計(jì)算機(jī)(如DOS)而言,線程既是進(jìn)程,進(jìn)程既是進(jìn)程,因?yàn)樗菃尉€程的。當(dāng)然一個(gè)程序可以是多線程的,多線程的各個(gè)線程看上去像是并行地獨(dú)自完成各自的工作,就像一臺一臺計(jì)算機(jī)上運(yùn)行著多個(gè)處理機(jī)一樣。在多處理機(jī)計(jì)算機(jī)上實(shí)現(xiàn)多線程時(shí),它們確實(shí)可以并行工作,而且采用適當(dāng)?shù)姆謺r(shí)策略可以大大提高程序運(yùn)行的效率。但是二者還是有較大的不同的,線程是共享地址空間的,也就是說多線程可以同時(shí)讀取相同的地址空間,并且利用這個(gè)空間進(jìn)行交換數(shù)據(jù)。
為什么要使用多線程呢?學(xué)過《計(jì)算機(jī)體系結(jié)構(gòu)》的人都知道。將順序執(zhí)行程序和采用多線程并行執(zhí)行程序相比,效率是可以大大地提高的。比如,有五個(gè)線程thread1, thread2, thread3, thread4, thread5,所耗的CPU時(shí)間分別為4,5,1,2,7。(假設(shè)CPU輪換周期為4個(gè)CPU時(shí)間,而且線程之間是彼此獨(dú)立的)順序執(zhí)行需要花費(fèi)19個(gè)CPU時(shí)間,而并行需要的時(shí)間肯定少于19個(gè)CPU時(shí)間,至于具體多少時(shí)間要看那些線程是可以同時(shí)執(zhí)行的。這是在非常小規(guī)模的情況下,要是面對大規(guī)模的進(jìn)程之間的交互的話,效率可以表現(xiàn)得更高。
與其他語言不一樣的是,線程的觀念在java是語言中是重要的,根深蒂固的,因?yàn)樵趈ava語言中的線程系統(tǒng)是java語言自建的, java中有專門的支持多線程的API庫,所以你可以以最快的速度寫一個(gè)支持線程的程序。在使用java創(chuàng)建線程的時(shí)候,你可以生成一個(gè)Thread類或者他的子類對象,并給這個(gè)對象發(fā)送start()消息(程序可以向任何一個(gè)派生自 Runnable 接口的類對象發(fā)送 start() 消息的),這樣一來程序會一直執(zhí)行,直到run返回為止,此時(shí)該線程就死掉了。
在java語言中,線程有如下特點(diǎn):
§ 在一個(gè)程序中而言,主線程的執(zhí)行位置就是main。而其他線程執(zhí)行的位置,程序員是可以自定義的。值得注意的是對Applet也是一樣。
§ 每個(gè)線程執(zhí)行其代碼的方式都是一次順序執(zhí)行的。
§ 一個(gè)線程執(zhí)行其代碼是與其他線程獨(dú)立開來的。如果諸線程之間又相互協(xié)作的話,就必須采用一定的交互機(jī)制。
名稱欄目:linux計(jì)劃任務(wù)命令行,Linux 任務(wù)計(jì)劃
鏈接分享:http://jinyejixie.com/article6/hssjog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、品牌網(wǎng)站建設(shè)、網(wǎng)站維護(hù)、定制網(wǎng)站、虛擬主機(jī)、微信公眾號
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)