国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

初深線程

2019-11-14 15:16:08
字體:
供稿:網(wǎng)友

java多線程編程

一、操作系統(tǒng)中線程和進(jìn)程的概念

現(xiàn)在的操作系統(tǒng)是多任務(wù)操作系統(tǒng)。多線程是實(shí)現(xiàn)多任務(wù)的一種方式。進(jìn)程是指一個(gè)內(nèi)存中運(yùn)行的應(yīng)用程序,每個(gè)進(jìn)程都有自己獨(dú)立的一塊內(nèi)存空間,一個(gè)進(jìn)程中可以啟動(dòng)多個(gè)線程。比如在Windows系統(tǒng)中,一個(gè)運(yùn)行的exe就是一個(gè)進(jìn)程。線程是指進(jìn)程中的一個(gè)執(zhí)行流程,一個(gè)進(jìn)程中可以運(yùn)行多個(gè)線程。比如java.exe進(jìn)程中可以運(yùn)行很多線程。線程總是屬于某個(gè)進(jìn)程,進(jìn)程中的多個(gè)線程共享進(jìn)程的內(nèi)存。同時(shí)”執(zhí)行是人的感覺,在線程之間實(shí)際上輪換執(zhí)行。

二、Java中的線程

在Java中,“線程”指兩件不同的事情:、java.lang.Thread類的一個(gè)實(shí)例;2、線程的執(zhí)行。使用java.lang.Thread類或者java.lang.Runnable接口編寫代碼來定義、實(shí)例化和啟動(dòng)新線程。一個(gè)Thread類實(shí)例只是一個(gè)對象,像Java中的任何其他對象一樣,具有變量和方法,生死于堆上。Java中,每個(gè)線程都有一個(gè)調(diào)用棧,即使不在程序中創(chuàng)建任何新的線程,線程也在后臺(tái)運(yùn)行著。一個(gè)Java應(yīng)用總是從main()方法開始運(yùn)行,mian()方法運(yùn)行在一個(gè)線程內(nèi),它被稱為主線程。一旦創(chuàng)建一個(gè)新的線程,就產(chǎn)生一個(gè)新的調(diào)用棧。線程總體分兩類:用戶線程和守候線程。當(dāng)所有用戶線程執(zhí)行完畢的時(shí)候,JVM自動(dòng)關(guān)閉。但是守候線程卻不獨(dú)立于JVM,守候線程一般是由操作系統(tǒng)或者用戶自己創(chuàng)建的。

 

Java線程:概念與原理

一、多線程的好處是什么

(1)多線程技術(shù)使程序的響應(yīng)速度更快 ,因?yàn)橛脩艚缑婵梢栽谶M(jìn)行其它工作的同時(shí)一直處于活動(dòng)狀態(tài);
(2)當(dāng)前沒有進(jìn)行處理的任務(wù)時(shí)可以將處理器時(shí)間讓給其它任務(wù);
(3)占用大量處理時(shí)間的任務(wù)可以定期將處理器時(shí)間讓給其它任務(wù);
(4)可以隨時(shí)停止任務(wù);
(5)可以分別設(shè)置各個(gè)任務(wù)的優(yōu)先級以優(yōu)化性能。

二、什么時(shí)候使用多線程技術(shù)

(1)耗時(shí)或大量占用處理器的任務(wù)阻塞用戶界面操作;
(2)各個(gè)任務(wù)必須等待外部資源 (如遠(yuǎn)程文件或 Internet連接)。

三、多線程的缺點(diǎn)是什么

(1)等候使用共享資源時(shí)造成程序的運(yùn)行速度變慢。這些共享資源主要是獨(dú)占性的資源 ,如打印機(jī)等。
(2)對線程進(jìn)行管理要求額外的 CPU開銷。線程的使用會(huì)給系統(tǒng)帶來上下文切換的額外負(fù)擔(dān)。當(dāng)這種負(fù)擔(dān)超過一定程度時(shí),多線程的特點(diǎn)主要表現(xiàn)在其缺點(diǎn)上,比如用獨(dú)立的線程來更新數(shù)組內(nèi)每個(gè)元素。
(3)線程的死鎖。即較長時(shí)間的等待或資源競爭以及死鎖等多線程癥狀。
(4)對公有變量的同時(shí)讀或?qū)憽.?dāng)多個(gè)線程需要對公有變量進(jìn)行寫操作時(shí),后一個(gè)線程往往會(huì)修改掉前一個(gè)線程存放的數(shù)據(jù),從而使前一個(gè)線程的參數(shù)被修改;另外 ,當(dāng)公用變量的讀寫操作是非原子性時(shí),在不同的機(jī)器上,中斷時(shí)間的不確定性,會(huì)導(dǎo)致數(shù)據(jù)在一個(gè)線程內(nèi)的操作產(chǎn)生錯(cuò)誤,從而產(chǎn)生莫名其妙的錯(cuò)誤,而這種錯(cuò)誤是程序員無法預(yù)知的。

Java線程:創(chuàng)建與啟動(dòng)

一、定義線程

1、擴(kuò)展java.lang.Thread類。
2、實(shí)現(xiàn)java.lang.Runnable接口。
 

二、實(shí)例化線程

1、如果是擴(kuò)展java.lang.Thread類的線程,則直接new即可。
2、如果是實(shí)現(xiàn)了java.lang.Runnable接口的類,則用Thread的構(gòu)造方法。

三、啟動(dòng)線程

在線程的Thread對象上調(diào)用start()方法,而不是run()或者別的方法。
在調(diào)用start()方法之前:線程處于新狀態(tài)中,新狀態(tài)指有一個(gè)Thread對象,但還沒有一個(gè)真正的線程。
在調(diào)用start()方法之后:發(fā)生了一系列復(fù)雜的事情
啟動(dòng)新的執(zhí)行線程(具有新的調(diào)用棧);
該線程從新狀態(tài)轉(zhuǎn)移到可運(yùn)行狀態(tài);
當(dāng)該線程獲得機(jī)會(huì)執(zhí)行時(shí),其目標(biāo)run()方法將運(yùn)行。
注意:對Java來說,run()方法沒有任何特別之處。像main()方法一樣,它只是新線程知道調(diào)用的方法名稱(和簽名)。因此,在Runnable上或者Thread上調(diào)用run方法是合法的。但并不啟動(dòng)新的線程。

Java線程:線程棧模型

線程棧是指某時(shí)刻時(shí)內(nèi)存中線程調(diào)度的棧信息,當(dāng)前調(diào)用的方法總是位于棧頂。線程棧的內(nèi)容是隨著程序的運(yùn)行動(dòng)態(tài)變化的,因此研究線程棧必須選擇一個(gè)運(yùn)行的時(shí)刻(實(shí)際上指代碼運(yùn)行到什么地方)。

Java線程:線程狀態(tài)的轉(zhuǎn)換

 

一、線程狀態(tài)

線程的狀態(tài)轉(zhuǎn)換是線程控制的基礎(chǔ)。線程狀態(tài)總的可分為五大狀態(tài),分別是:

二、阻止線程執(zhí)行

我們只考慮三種狀態(tài),分別是哪三種呢?

1、睡眠

Thread.sleep(longmillis)和Thread.sleep(long millis, int nanos)靜態(tài)方法強(qiáng)制當(dāng)前正在執(zhí)行的線程休眠(暫停執(zhí)行),以“減慢線程”。當(dāng)線程睡眠時(shí),它入睡在某個(gè)地方,在蘇醒之前不會(huì)返回到可運(yùn)行狀態(tài)。當(dāng)睡眠時(shí)間到期,則返回到可運(yùn)行狀態(tài)。
線程睡眠的原因:線程執(zhí)行太快,或者需要強(qiáng)制進(jìn)入下一輪,因?yàn)镴ava規(guī)范不保證合理的輪換。
注意:
1、線程睡眠是幫助所有線程獲得運(yùn)行機(jī)會(huì)的最好方法。
2、線程睡眠到期自動(dòng)蘇醒,并返回到可運(yùn)行狀態(tài),不是運(yùn)行狀態(tài)。sleep()中指定的時(shí)間是線程不會(huì)運(yùn)行的最短時(shí)間。因此,sleep()方法不能保證該線程睡眠到期后就開始執(zhí)行。
3、sleep()是靜態(tài)方法,只能控制當(dāng)前正在運(yùn)行的線程。
4、線程的優(yōu)先級和線程讓步y(tǒng)ield()
線程的讓步是通過Thread.yield()來實(shí)現(xiàn)的。yield()方法的作用是:暫停當(dāng)前正在執(zhí)行的線程對象,并執(zhí)行其他線程。
要理解yield(),必須了解線程的優(yōu)先級的概念。線程總是存在優(yōu)先級,優(yōu)先級范圍在1~10之間。JVM線程調(diào)度程序是基于優(yōu)先級的搶先調(diào)度機(jī)制。在大多數(shù)情況下,當(dāng)前運(yùn)行的線程優(yōu)先級將大于或等于線程池中任何線程的優(yōu)先級。但這僅僅是大多數(shù)情況。
注意:當(dāng)設(shè)計(jì)多線程應(yīng)用程序的時(shí)候,一定不要依賴于線程的優(yōu)先級。因?yàn)榫€程調(diào)度優(yōu)先級操作是沒有保障的,只能把線程優(yōu)先級作用作為一種提高程序效率的方法,但是要保證程序不依賴這種操作。
當(dāng)線程池中線程都具有相同的優(yōu)先級,調(diào)度程序的JVM實(shí)現(xiàn)自由選擇它喜歡的線程。這時(shí)候調(diào)度程序的操作有兩種可能:一是選擇一個(gè)線程運(yùn)行,直到它阻塞或者運(yùn)行完成為止。二是時(shí)間分片,為池內(nèi)的每個(gè)線程提供均等的運(yùn)行機(jī)會(huì)。
設(shè)置線程的優(yōu)先級:線程默認(rèn)的優(yōu)先級是創(chuàng)建它的執(zhí)行線程的優(yōu)先級。可以通過setPRiority(intnewPriority)更改線程的優(yōu)先級。
線程優(yōu)先級為1~10之間的正整數(shù),JVM從不會(huì)改變一個(gè)線程的優(yōu)先級。然而,1~10之間的值是沒有保證的。一些JVM可能不能識(shí)別10個(gè)不同的值,而將這些優(yōu)先級進(jìn)行每兩個(gè)或多個(gè)合并,變成少于10個(gè)的優(yōu)先級,則兩個(gè)或多個(gè)優(yōu)先級的線程可能被映射為一個(gè)優(yōu)先級。

3、Thread.yield()方法

Thread.yield()方法作用是:暫停當(dāng)前正在執(zhí)行的線程對象,并執(zhí)行其他線程。
yield()應(yīng)該做的是讓當(dāng)前運(yùn)行線程回到可運(yùn)行狀態(tài),以允許具有相同優(yōu)先級的其他線程獲得運(yùn)行機(jī)會(huì)。因此,使用yield()的目的是讓相同優(yōu)先級的線程之間能適當(dāng)?shù)妮嗈D(zhuǎn)執(zhí)行。但是,實(shí)際中無法保證yield()達(dá)到讓步目的,因?yàn)樽尣降木€程還有可能被線程調(diào)度程序再次選中。

4、join()方法

Thread的非靜態(tài)方法join()讓一個(gè)線程B“加入”到另外一個(gè)線程A的尾部。在A執(zhí)行完畢之前,B不能工作。
另外,join()方法還有帶超時(shí)限制的重載版本。例如t.join(5000);則讓線程等待5000毫秒,如果超過這個(gè)時(shí)間,則停止等待,變?yōu)榭蛇\(yùn)行狀態(tài)。
線程的加入join()對線程棧導(dǎo)致的結(jié)果是線程棧發(fā)生了變化,當(dāng)然這些變化都是瞬時(shí)的。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 成武县| 辛集市| 常熟市| 安多县| 武冈市| 蒲江县| 武平县| 大竹县| 陆河县| 凤阳县| 华池县| 宁德市| 新丰县| 三台县| 米林县| 和田市| 社会| 芷江| 承德市| 灵丘县| 甘孜| 丹江口市| 饶平县| 上栗县| 绵竹市| 大洼县| 乌审旗| 萨迦县| 虹口区| 油尖旺区| 乌鲁木齐市| 武安市| 宁都县| 潢川县| 嘉义县| 藁城市| 黄平县| 慈利县| 广灵县| 九寨沟县| 滨海县|