多線程編程

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)而提升整體處理性能。

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

多線程的作用:是為了同步完成多項(xiàng)任務(wù),不是為了提高運(yùn)行效率,而是為了提高資源使用效率來(lái)提高系統(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ù)長(zhǎng)時(shí)間的程序中的任務(wù)放到后臺(tái)去處理,同時(shí)執(zhí)行其他操作,提高效率

3)、當(dāng)前沒(méi)有進(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)帶來(lái)上下文切換的額外負(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(無(wú)返回值)

3.實(shí)現(xiàn)Callable接口,通過(guò)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ò)展功能,可以幫助我們簡(jiǎn)化異步編程的復(fù)雜性,提供了函數(shù)式編程的能力,可以通過(guò)回調(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());

? ? ? ? }

}

//無(wú)返回值

? ? 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)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容