多線程編程

1.什么是線程涉馅,多線程

線程 : 是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位雹顺;它被包含在進(jìn)程之中斑匪,是進(jìn)程中的實(shí)際運(yùn)作單位。

多線程 : 是指從軟件或者硬件上實(shí)現(xiàn)多個(gè)線程并發(fā)執(zhí)行的技術(shù)河爹。具有多線程能力的計(jì)算機(jī)因有硬件支持而能夠在同一時(shí)間執(zhí)行多于一個(gè)線程,進(jìn)而提升整體處理性能桐款。

簡單來說:線程是程序中一個(gè)單一的順序控制流程咸这;而多線程就是在單個(gè)程序中同時(shí)運(yùn)行多個(gè)線程來完成不同的工作。

多線程的作用:是為了同步完成多項(xiàng)任務(wù)鲁僚,不是為了提高運(yùn)行效率炊苫,而是為了提高資源使用效率來提高系統(tǒng)的效率。多線程是在同一時(shí)間需要完成多項(xiàng)任務(wù)的時(shí)候?qū)崿F(xiàn)的冰沙。

2.多線程的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

1)侨艾、多線程技術(shù)可以加快程序的運(yùn)行速度,使程序的響應(yīng)速度更快拓挥,因?yàn)橛脩艚缑婵梢栽谶M(jìn)行其它工作的同時(shí)一直處于活動(dòng)狀態(tài)

2)唠梨、可以把占據(jù)長時(shí)間的程序中的任務(wù)放到后臺(tái)去處理,同時(shí)執(zhí)行其他操作侥啤,提高效率

3)当叭、當(dāng)前沒有進(jìn)行處理的任務(wù)時(shí)可以將處理器時(shí)間讓給其它任務(wù)

4)茬故、可以讓同一個(gè)程序的不同部分并發(fā)執(zhí)行,釋放一些珍貴的資源如內(nèi)存占用等等

5)蚁鳖、可以隨時(shí)停止任務(wù)

6)磺芭、可以分別設(shè)置各個(gè)任務(wù)的優(yōu)先級(jí)以優(yōu)化性能

缺點(diǎn):

1)、因?yàn)槎嗑€程需要開辟內(nèi)存醉箕,而且線程切換需要時(shí)間因此會(huì)很消耗系統(tǒng)內(nèi)存钾腺。

2)、線程的終止會(huì)對(duì)程序產(chǎn)生影響

3)讥裤、由于多個(gè)線程之間存在共享數(shù)據(jù)放棒,因此容易出現(xiàn)線程死鎖的情況

4)、對(duì)線程進(jìn)行管理要求額外的 CPU開銷己英。線程的使用會(huì)給系統(tǒng)帶來上下文切換的額外負(fù)擔(dān)间螟。

3.多線程的實(shí)現(xiàn)方式有哪些

1. 繼承Thread類,重寫run方法

2.實(shí)現(xiàn)Runnable接口损肛,重寫run方法厢破,實(shí)現(xiàn)Runnable接口的實(shí)現(xiàn)類的實(shí)例對(duì)象作為Thread構(gòu)造函數(shù)的target(無返回值)

3.實(shí)現(xiàn)Callable接口,通過Callable和FutureTask創(chuàng)建線程 (有返回值)

4.線程池:提供了一個(gè)線程隊(duì)列荧关,隊(duì)列中保存著所有等待狀態(tài)的線程溉奕。避免了創(chuàng)建與銷毀額外開銷,提高了響應(yīng)的速度忍啤。

5.CompletableFuture加勤,JDK1.8中的CompletableFuture為我們提供了異步函數(shù)式編程,CompletableFuture提供了非常強(qiáng)大的Future的擴(kuò)展功能,可以幫助我們簡化異步編程的復(fù)雜性同波,提供了函數(shù)式編程的能力鳄梅,可以通過回調(diào)的方式處理計(jì)算結(jié)果,并且提供了轉(zhuǎn)換和組合CompletableFuture的方法未檩。

6.Spring的@Async注解

4.體系結(jié)構(gòu)

java.util.concurrent.Executor : 負(fù)責(zé)線程的使用與調(diào)度的根接口

|--ExecutorService 子接口: 線程池的主要接口

|--ThreadPoolExecutor 線程池的實(shí)現(xiàn)類

|--ScheduledExecutorService 子接口:負(fù)責(zé)線程的調(diào)度

|--ScheduledThreadPoolExecutor :繼承 ThreadPoolExecutor戴尸, 實(shí)現(xiàn) ScheduledExecutorService *

工具類 : Executors

ExecutorService newFixedThreadPool() : 創(chuàng)建固定大小的線程池

ExecutorService newCachedThreadPool() : 緩存線程池,線程池的數(shù)量不固定冤狡,可以根據(jù)需求自動(dòng)的更改數(shù)量孙蒙。

ExecutorService newSingleThreadExecutor() : 創(chuàng)建單個(gè)線程池。線程池中只有一個(gè)線程

ScheduledExecutorService newScheduledThreadPool() : 創(chuàng)建固定大小的線程悲雳,可以延遲或定時(shí)的執(zhí)行任務(wù)挎峦。

5.代碼示例

public class TestThread {

public static void main(String[]args)throws Exception {

//1.繼承Thread類

? ? ? ? ThreadTest threadTest =new ThreadTest();

? ? ? ? threadTest.start();

? ? ? ? //2.實(shí)現(xiàn)Runnable接口

? ? ? ? RunnableTest runnableTest =new RunnableTest();

? ? ? ? new Thread(runnableTest).start();

? ? ? ? //3.實(shí)現(xiàn)Callable接口

? ? ? ? CallableTest callableTest =new CallableTest();

? ? ? ? FutureTask futureTask =new FutureTask<>(callableTest);

? ? ? ? new Thread(futureTask).start();

? ? ? ? Listlists = (List)futureTask.get();

? ? ? ? for (Integer integer :lists) {

System.out.print(integer +"? ");

? ? ? ? }

System.out.print("? ");

? ? ? ? //4.使用線程池

? ? ? ? ThreadPoolTest();

? ? ? ? //5.使用CompletableFuture

? ? ? ? CompletableFutureTest_runAsync();

? ? ? ? CompletableFutureTest_supplyAsync();

? ? }

static class? ThreadTest extends Thread{

@Override

? ? ? ? public void run() {

for(int i? =0 ; i <10 ; i ++) {

if(i %2 ==0) {

System.out.print(i+"? ");

? ? ? ? ? ? ? ? }

}

System.out.println(" ");

? ? ? ? }

}

static class RunnableTest implements Runnable{

@Override

? ? ? ? public void run() {

for(int i? =0 ; i <10 ; i ++) {

if(i %3 ==0) {

System.out.print(i+"? ");

? ? ? ? ? ? ? ? }

}

System.out.println(" ");

? ? ? ? }

}

static? class CallableTest implements Callable> {

@Override

? ? ? ? public Listcall()throws Exception {

Listlists =new ArrayList<>();

? ? ? ? ? ? for(int i? =3 ; i <100 ; i ++) {

if(i %4 ==0) {

lists.add(i);

? ? ? ? ? ? ? ? }

}

return lists;

? ? ? ? }

}

public static void ThreadPoolTest()throws ExecutionException, InterruptedException {

ExecutorService executorService =Executors.newFixedThreadPool(5);

? ? ? ? List>>ints =new ArrayList<>();

? ? ? ? int[]arr = {10,20,31,40,50};

? ? ? ? for(int i =0; i

int finalI =i;

? ? ? ? ? ? Future>future =executorService.submit(() -> {

System.out.println(Thread.currentThread().getName()+"? ");

? ? ? ? ? ? ? ? Listlists =new ArrayList<>();

? ? ? ? ? ? ? ? ? ? if(arr[finalI] %10 ==0) {

lists.add(arr[finalI]);

? ? ? ? ? ? ? ? ? ? }

return lists;

? ? ? ? ? ? });

? ? ? ? ? ? ints.add(future);

? ? ? ? }

for (Future>future :ints) {

System.out.println(future.get());

? ? ? ? }

}

//無返回值

? ? public static void CompletableFutureTest_runAsync()throws Exception {

CompletableFuturefuture =CompletableFuture.runAsync(() -> {

try {

TimeUnit.SECONDS.sleep(1);

? ? ? ? ? ? }catch (InterruptedException e) {

}

System.out.println("run end ...");

? ? ? ? });

? ? ? ? future.get();

? ? }

//有返回值

? ? public static void CompletableFutureTest_supplyAsync()throws Exception {

CompletableFuturefuture =CompletableFuture.supplyAsync(() -> {

try {

TimeUnit.SECONDS.sleep(1);

? ? ? ? ? ? }catch (InterruptedException e) {

}

System.out.println("run end ...");

? ? ? ? ? ? return System.currentTimeMillis();

? ? ? ? });

? ? ? ? long time =future.get();

? ? ? ? System.out.println("time = "+time);

? ? }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市合瓢,隨后出現(xiàn)的幾起案子坦胶,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件顿苇,死亡現(xiàn)場離奇詭異峭咒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)纪岁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門凑队,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蜂科,你說我怎么就攤上這事顽决。” “怎么了导匣?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長茸时。 經(jīng)常有香客問我贡定,道長,這世上最難降的妖魔是什么可都? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任缓待,我火速辦了婚禮,結(jié)果婚禮上渠牲,老公的妹妹穿的比我還像新娘旋炒。我一直安慰自己,他們只是感情好签杈,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布瘫镇。 她就那樣靜靜地躺著,像睡著了一般答姥。 火紅的嫁衣襯著肌膚如雪铣除。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天鹦付,我揣著相機(jī)與錄音尚粘,去河邊找鬼。 笑死敲长,一個(gè)胖子當(dāng)著我的面吹牛郎嫁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播祈噪,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼泽铛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了钳降?” 一聲冷哼從身側(cè)響起厚宰,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后铲觉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體澈蝙,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年撵幽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了灯荧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盐杂,死狀恐怖逗载,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情链烈,我是刑警寧澤厉斟,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站强衡,受9級(jí)特大地震影響擦秽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜漩勤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一感挥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧越败,春花似錦触幼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至噪猾,卻和暖如春霉祸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背袱蜡。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國打工丝蹭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坪蚁。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓奔穿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親敏晤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贱田,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容

  • Java 給多線程編程提供了內(nèi)置的支持。 一條線程指的是進(jìn)程中一個(gè)單一順序的控制流嘴脾,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程男摧,每...
    JWking閱讀 223評(píng)論 0 1
  • Java給多線程編程提供了內(nèi)置的支持蔬墩。一個(gè)多線程程序包含兩個(gè)或多個(gè)能并發(fā)運(yùn)行的部分。程序的每一部分都稱作一個(gè)線程耗拓,...
    編程小世界閱讀 365評(píng)論 0 1
  • Java 給多線程編程提供了內(nèi)置的支持拇颅。 一條線程指的是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程乔询,每...
    代碼人生sl閱讀 157評(píng)論 0 0
  • 本文主要基于 高洪巖《Java多線程編程核心技術(shù)》一書樟插,文章目錄基本與書保持一致,由于想偷懶就將看書過程中的md筆...
    LeonardoEzio閱讀 1,109評(píng)論 2 3
  • 前言: Java的多線程編程隨著應(yīng)用功能越來越復(fù)雜竿刁,用戶對(duì)軟件體驗(yàn)要求越來越高黄锤,那么對(duì)于多線程的編程越發(fā)重要了。接...
    CaoMeng閱讀 293評(píng)論 0 0