国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java并發(fā)(二)----初次使用多線(xiàn)程并行提高效率

這篇具有很好參考價(jià)值的文章主要介紹了Java并發(fā)(二)----初次使用多線(xiàn)程并行提高效率。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1、并行

并行代表充分利用多核 cpu 的優(yōu)勢(shì),提高運(yùn)行效率。

想象下面的場(chǎng)景,執(zhí)行 3 個(gè)計(jì)算,最后將計(jì)算結(jié)果匯總。

計(jì)算 1 花費(fèi) 10 ms
?
計(jì)算 2 花費(fèi) 11 ms
?
計(jì)算 3 花費(fèi) 9 ms
?
匯總需要 1 ms
  • 如果是串行執(zhí)行,那么總共花費(fèi)的時(shí)間是 10 + 11 + 9 + 1 = 31ms

  • 但如果是四核 cpu,各個(gè)核心分別使用線(xiàn)程 1 執(zhí)行計(jì)算 1,線(xiàn)程 2 執(zhí)行計(jì)算 2,線(xiàn)程 3 執(zhí)行計(jì)算 3,那么 3 個(gè)線(xiàn)程是并行的,花費(fèi)時(shí)間只取決于最長(zhǎng)的那個(gè)線(xiàn)程運(yùn)行的時(shí)間,即 11ms 最后加上匯總時(shí)間只會(huì)花費(fèi) 12ms

注意

需要在多核 cpu 才能提高效率,單核仍然時(shí)是輪流執(zhí)行

2、設(shè)計(jì)

1) 環(huán)境搭建

  • 基準(zhǔn)測(cè)試工具選擇,使用了比較靠譜的基準(zhǔn)測(cè)試框架 JMH,它會(huì)執(zhí)行程序預(yù)熱(會(huì)對(duì)反復(fù)執(zhí)行的代碼進(jìn)行優(yōu)化),執(zhí)行多次測(cè)試并平均

  • cpu 核數(shù)限制,有兩種思路

    1. 建議使用虛擬機(jī),分配合適的核

    2. 使用 msconfig,分配合適的核,需要重啟比較麻煩

  • 并行計(jì)算方式的選擇

    1. 最初想直接使用 parallel stream,后來(lái)發(fā)現(xiàn)它有自己的問(wèn)題

    2. 改為了自己手動(dòng)控制 thread,實(shí)現(xiàn)簡(jiǎn)單的并行計(jì)算

  • 引入jar包

 ? ?<dependencies>
 ? ? ? ?<dependency>
 ? ? ? ? ? ?<groupId>org.openjdk.jmh</groupId>
 ? ? ? ? ? ?<artifactId>jmh-core</artifactId>
 ? ? ? ? ? ?<version>1.0</version>
 ? ? ? ?</dependency>
 ? ? ? ?<dependency>
 ? ? ? ? ? ?<groupId>org.openjdk.jmh</groupId>
 ? ? ? ? ? ?<artifactId>jmh-generator-annprocess</artifactId>
 ? ? ? ? ? ?<version>1.0</version>
 ? ? ? ? ? ?<scope>provided</scope>
 ? ? ? ?</dependency>
 ? ?</dependencies>

如下代碼測(cè)試

?
package org.sample;
?
import java.util.Arrays;
import java.util.concurrent.FutureTask;
?
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.Warmup;
?
@Fork(1)
@BenchmarkMode(Mode.AverageTime) ?//測(cè)試模式 這里平均時(shí)間
@Warmup(iterations=3) // 熱身次數(shù)
@Measurement(iterations=5) // 五輪驗(yàn)證
public class MyBenchmark {
    static int[] ARRAY = new int[1000_000_00]; // 這里可根據(jù)電腦配置調(diào)整大小,避免堆溢出錯(cuò)誤
    static {
        Arrays.fill(ARRAY, 1);
    }
 ? ?// 建立4個(gè)線(xiàn)程
 ? ?@Benchmark
 ? ?public int c() throws Exception {
 ? ? ? ?int[] array = ARRAY;
 ? ? ? ?FutureTask<Integer> t1 = new FutureTask<>(()->{
 ? ? ?      int sum = 0;
 ? ? ?      for(int i = 0; i < 250_000_00;i++) {
 ? ? ?          sum += array[0+i];
 ? ? ?      }
 ? ? ?      return sum;
 ? ? ?  });
 ? ? ? ?FutureTask<Integer> t2 = new FutureTask<>(()->{
 ? ? ?      int sum = 0;
 ? ? ?      for(int i = 0; i < 250_000_00;i++) {
 ? ? ?          sum += array[250_000_00+i];
 ? ? ?      }
 ? ? ?      return sum;
 ? ? ?  });
 ? ? ? ?FutureTask<Integer> t3 = new FutureTask<>(()->{
 ? ? ?      int sum = 0;
 ? ? ?      for(int i = 0; i < 250_000_00;i++) {
 ? ? ?          sum += array[500_000_00+i];
 ? ? ?      }
 ? ? ?      return sum;
 ? ? ?  });
 ? ? ? ?FutureTask<Integer> t4 = new FutureTask<>(()->{
 ? ? ?      int sum = 0;
 ? ? ?      for(int i = 0; i < 250_000_00;i++) {
 ? ? ?          sum += array[750_000_00+i];
 ? ? ?      }
 ? ? ?      return sum;
 ? ? ?  });
 ? ? ? ?new Thread(t1).start();
 ? ? ? ?new Thread(t2).start();
 ? ? ? ?new Thread(t3).start();
 ? ? ? ?new Thread(t4).start();
 ? ? ? ?return t1.get() + t2.get() + t3.get()+ t4.get();
 ?  }
 ? ?// 單線(xiàn)程
 ? ?@Benchmark
 ? ?public int d() throws Exception {
 ? ? ? ?int[] array = ARRAY;
 ? ? ? ?FutureTask<Integer> t1 = new FutureTask<>(()->{
 ? ? ?      int sum = 0;
 ? ? ?      for(int i = 0; i < 1000_000_00;i++) {
 ? ? ?          sum += array[0+i];
 ? ? ?      }
 ? ? ?      return sum;
 ? ? ?  });
 ? ? ? ?new Thread(t1).start();
 ? ? ? ?return t1.get();
 ?  }
}

2) 雙核 CPU(4個(gè)邏輯CPU)

C:\Users\lenovo\eclipse-workspace\test>java -jar target/benchmarks.jar
# VM invoker: C:\Program Files\Java\jdk-11\bin\java.exe
# VM options: <none>
# Warmup: 3 iterations, 1 s each
# Measurement: 5 iterations, 1 s each
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Average time, time/op
# Benchmark: org.sample.MyBenchmark.c
?
# Run progress: 0.00% complete, ETA 00:00:16
# Fork: 1 of 1
# Warmup Iteration ? 1: 0.022 s/op
# Warmup Iteration ? 2: 0.019 s/op
# Warmup Iteration ? 3: 0.020 s/op
Iteration ? 1: 0.020 s/op
Iteration ? 2: 0.020 s/op
Iteration ? 3: 0.020 s/op
Iteration ? 4: 0.020 s/op
Iteration ? 5: 0.020 s/op
?
?
Result: 0.020 ±(99.9%) 0.001 s/op [Average]
  Statistics: (min, avg, max) = (0.020, 0.020, 0.020), stdev = 0.000
  Confidence interval (99.9%): [0.019, 0.021]
?
?
# VM invoker: C:\Program Files\Java\jdk-11\bin\java.exe
# VM options: <none>
# Warmup: 3 iterations, 1 s each
# Measurement: 5 iterations, 1 s each
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Average time, time/op
# Benchmark: org.sample.MyBenchmark.d
?
# Run progress: 50.00% complete, ETA 00:00:10
# Fork: 1 of 1
# Warmup Iteration ? 1: 0.042 s/op
# Warmup Iteration ? 2: 0.042 s/op
# Warmup Iteration ? 3: 0.041 s/op
Iteration ? 1: 0.043 s/op
Iteration ? 2: 0.042 s/op
Iteration ? 3: 0.042 s/op
Iteration ? 4: 0.044 s/op
Iteration ? 5: 0.042 s/op
?
?
Result: 0.043 ±(99.9%) 0.003 s/op [Average]
  Statistics: (min, avg, max) = (0.042, 0.043, 0.044), stdev = 0.001
  Confidence interval (99.9%): [0.040, 0.045]
?
?
# Run complete. Total time: 00:00:20
?
Benchmark ? ? ? ? ?  Mode  Samples  Score  Score error  Units
o.s.MyBenchmark.c ?  avgt ? ? ? ?5 ?0.020 ? ? ? ?0.001 ? s/op
o.s.MyBenchmark.d ?  avgt ? ? ? ?5 ?0.043 ? ? ? ?0.003 ? s/op

在最后兩行的結(jié)論中,可以看到多核下,效率提升還是很明顯的,快了一倍左右

3) 單核 CPU

單核cpu建議開(kāi)虛擬機(jī)測(cè)試,這里就不驗(yàn)證了。直接看結(jié)果

C:\Users\lenovo\eclipse-workspace\test>java -jar target/benchmarks.jar
# VM invoker: C:\Program Files\Java\jdk-11\bin\java.exe
# VM options: <none>
# Warmup: 3 iterations, 1 s each
# Measurement: 5 iterations, 1 s each
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Average time, time/op
# Benchmark: org.sample.MyBenchmark.c
?
# Run progress: 0.00% complete, ETA 00:00:16
# Fork: 1 of 1
# Warmup Iteration ? 1: 0.064 s/op
# Warmup Iteration ? 2: 0.052 s/op
# Warmup Iteration ? 3: 1.127 s/op
Iteration ? 1: 0.053 s/op
Iteration ? 2: 0.052 s/op
Iteration ? 3: 0.053 s/op
Iteration ? 4: 0.057 s/op
Iteration ? 5: 0.088 s/op
?
?
Result: 0.061 ±(99.9%) 0.060 s/op [Average]
  Statistics: (min, avg, max) = (0.052, 0.061, 0.088), stdev = 0.016
  Confidence interval (99.9%): [0.001, 0.121]
?
?
# VM invoker: C:\Program Files\Java\jdk-11\bin\java.exe
# VM options: <none>
# Warmup: 3 iterations, 1 s each
# Measurement: 5 iterations, 1 s each
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Average time, time/op
# Benchmark: org.sample.MyBenchmark.d
?
# Run progress: 50.00% complete, ETA 00:00:11
# Fork: 1 of 1
# Warmup Iteration ? 1: 0.054 s/op
# Warmup Iteration ? 2: 0.053 s/op
# Warmup Iteration ? 3: 0.051 s/op
Iteration ? 1: 0.096 s/op
Iteration ? 2: 0.054 s/op
Iteration ? 3: 0.065 s/op
Iteration ? 4: 0.050 s/op
Iteration ? 5: 0.055 s/op
?
?
Result: 0.064 ±(99.9%) 0.071 s/op [Average]
  Statistics: (min, avg, max) = (0.050, 0.064, 0.096), stdev = 0.018
  Confidence interval (99.9%): [-0.007, 0.135]
?
?
# Run complete. Total time: 00:00:22
?
Benchmark ? ? ? ? ?  Mode  Samples  Score  Score error  Units
o.s.MyBenchmark.c ?  avgt ? ? ? ?5 ?0.061 ? ? ? ?0.060 ? s/op
o.s.MyBenchmark.d ?  avgt ? ? ? ?5 ?0.064 ? ? ? ?0.071 ? s/op

可以看到性能幾乎是一樣的

4) 結(jié)論

  1. 單核 cpu 下,多線(xiàn)程不能實(shí)際提高程序運(yùn)行效率,只是為了能夠在不同的任務(wù)之間切換,不同線(xiàn)程輪流使用 cpu ,不至于一個(gè)線(xiàn)程總占用 cpu,別的線(xiàn)程沒(méi)法干活

  2. 多核 cpu 可以并行跑多個(gè)線(xiàn)程,但能否提高程序運(yùn)行效率還是要分情況的

    • 有些任務(wù),經(jīng)過(guò)精心設(shè)計(jì),將任務(wù)拆分,并行執(zhí)行,當(dāng)然可以提高程序的運(yùn)行效率。但不是所有計(jì)算任務(wù)都能拆分

    • 也不是所有任務(wù)都需要拆分,任務(wù)的目的如果不同,談拆分和效率沒(méi)啥意義

  3. IO 操作不占用 cpu,只是我們一般拷貝文件使用的是【阻塞 IO】,這時(shí)相當(dāng)于線(xiàn)程雖然不用 cpu,但需要一直等待 IO 結(jié)束,沒(méi)能充分利用線(xiàn)程。所以才有【非阻塞 IO】和【異步 IO】來(lái)提升線(xiàn)程的利用率

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-412561.html

到了這里,關(guān)于Java并發(fā)(二)----初次使用多線(xiàn)程并行提高效率的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 并發(fā),并行,線(xiàn)程與UI操作

    并行和并發(fā)是計(jì)算機(jī)領(lǐng)域中兩個(gè)相關(guān)但不同的概念。 并行(Parallel)指的是同時(shí)執(zhí)行多個(gè)任務(wù)或操作 ,它依賴(lài)于具有多個(gè)處理單元的系統(tǒng)。在并行計(jì)算中,任務(wù)被分成多個(gè)子任務(wù),并且這些子任務(wù)可以同時(shí)在不同的處理單元上執(zhí)行,從而加速整體的計(jì)算速度。并行計(jì)算能夠充

    2024年01月21日
    瀏覽(27)
  • 多線(xiàn)程并發(fā)和多任務(wù)并行的小結(jié)

    一、多線(xiàn)程并行的一點(diǎn)小結(jié) 1.無(wú)論是thread::spawn還是tokio::spawn,都是創(chuàng)建一個(gè)線(xiàn)程或者任務(wù)去執(zhí)行閉包的函數(shù)體。thread::spawn接受一個(gè)閉包作為參數(shù),并返回一個(gè) JoinHandle,其中 T 是閉包的返回類(lèi)型。創(chuàng)建的新線(xiàn)程將在后臺(tái)運(yùn)行,并執(zhí)行閉包中的代碼。 2.多線(xiàn)程并行:其他的高級(jí)

    2024年02月10日
    瀏覽(22)
  • curl+postman 在java開(kāi)發(fā)中的使用(提高效率)

    curl+postman 在java開(kāi)發(fā)中的使用(提高效率)

    curl 是一個(gè)常用的命令行工具,用于發(fā)送各種類(lèi)型的 HTTP 請(qǐng)求,包括 GET、POST、PUT、DELETE 等。它也可以用來(lái)下載文件、上傳文件、設(shè)置 cookie、發(fā)送 multipart/form-data 等等。 實(shí)際中的接口: 分析 --location:此選項(xiàng)用于啟用HTTP重定向的自動(dòng)處理 --request POST:指定請(qǐng)求方法為POST --

    2024年02月03日
    瀏覽(21)
  • 【Selenium】提高測(cè)試&爬蟲(chóng)效率:Selenium與多線(xiàn)程的完美結(jié)合

    【Selenium】提高測(cè)試&爬蟲(chóng)效率:Selenium與多線(xiàn)程的完美結(jié)合

    使用 Selenium 創(chuàng)建多個(gè)瀏覽器,這在自動(dòng)化操作中非常常見(jiàn)。 而在Python中,使用 Selenium + threading 或 Selenium + ThreadPoolExecutor 都是很好的實(shí)現(xiàn)方法。 應(yīng)用場(chǎng)景: 創(chuàng)建多個(gè)瀏覽器用于測(cè)試或者數(shù)據(jù)采集; 使用 Selenium 控制本地安裝的 chrome瀏覽器 去做一些操作 … 文章提供了 Selen

    2024年02月10日
    瀏覽(45)
  • 【PyQt5實(shí)現(xiàn)多線(xiàn)程更新UI】- 提高程序效率,優(yōu)化用戶(hù)體驗(yàn)

    【PyQt5實(shí)現(xiàn)多線(xiàn)程更新UI】- 提高程序效率,優(yōu)化用戶(hù)體驗(yàn) 在PyQt5應(yīng)用程序的開(kāi)發(fā)中,當(dāng)程序需要處理大量數(shù)據(jù)或進(jìn)行復(fù)雜的計(jì)算時(shí),如果僅使用主線(xiàn)程,會(huì)導(dǎo)致GUI界面失去響應(yīng),用戶(hù)體驗(yàn)較差。為了解決這個(gè)問(wèn)題,通常需要使用多線(xiàn)程技術(shù)。 而在使用多線(xiàn)程時(shí),往往需要更新

    2024年02月07日
    瀏覽(16)
  • Python多線(xiàn)程爬蟲(chóng)為何效率低下?解析原因并提高爬蟲(chóng)速度的方法

    線(xiàn)程(Thread)也叫輕量級(jí)進(jìn)程,是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位,它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。線(xiàn)程自己不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源,但它可與同屬的一個(gè)進(jìn)程的其它線(xiàn)程共享進(jìn)程所擁有的全部資源。一個(gè)線(xiàn)程可以創(chuàng)建

    2024年02月01日
    瀏覽(19)
  • 計(jì)算機(jī)視覺(jué)---flask框架封裝目標(biāo)檢測(cè),應(yīng)用線(xiàn)程提高程序運(yùn)行效率

    計(jì)算機(jī)視覺(jué)---flask框架封裝目標(biāo)檢測(cè),應(yīng)用線(xiàn)程提高程序運(yùn)行效率

    1.前言 上一篇文章flask部署 目標(biāo)檢測(cè)算法中講到可以將檢測(cè)算法封裝到flask框架中進(jìn)行web端展示,但在實(shí)際應(yīng)用中發(fā)現(xiàn)一些問(wèn)題并進(jìn)行了解決,在本文中進(jìn)行補(bǔ)充。 2.利用線(xiàn)程,提高flask程序運(yùn)行效率 flask web端訪(fǎng)問(wèn)時(shí),每次都會(huì)從頭加載程序,導(dǎo)致每次訪(fǎng)問(wèn)頁(yè)面刷新率很低或

    2024年02月16日
    瀏覽(27)
  • 爬蟲(chóng)入門(mén)指南(5): 分布式爬蟲(chóng)與并發(fā)控制 【提高爬取效率與請(qǐng)求合理性控制的實(shí)現(xiàn)方法】

    爬蟲(chóng)入門(mén)指南(5): 分布式爬蟲(chóng)與并發(fā)控制 【提高爬取效率與請(qǐng)求合理性控制的實(shí)現(xiàn)方法】

    在進(jìn)行爬蟲(chóng)任務(wù)時(shí),我們常常會(huì)面臨兩個(gè)重要問(wèn)題:如何提高爬取效率以及如何合理控制請(qǐng)求的并發(fā)量,以避免對(duì)目標(biāo)網(wǎng)站造成過(guò)大的壓力。針對(duì)這些問(wèn)題,本文將介紹分布式爬蟲(chóng)與并發(fā)控制的相關(guān)知識(shí)點(diǎn),并演示使用Scrapy框架實(shí)現(xiàn)分布式爬蟲(chóng),并對(duì)并發(fā)控制進(jìn)行限制請(qǐng)求頻

    2024年02月12日
    瀏覽(25)
  • 【Java|多線(xiàn)程與高并發(fā)】線(xiàn)程安全問(wèn)題以及synchronized使用實(shí)例

    【Java|多線(xiàn)程與高并發(fā)】線(xiàn)程安全問(wèn)題以及synchronized使用實(shí)例

    Java多線(xiàn)程環(huán)境下,多個(gè)線(xiàn)程同時(shí)訪(fǎng)問(wèn)共享資源時(shí)可能出現(xiàn)的數(shù)據(jù)競(jìng)爭(zhēng)和不一致的情況。 線(xiàn)程安全一直都是一個(gè)令人頭疼的問(wèn)題.為了解決這個(gè)問(wèn)題,Java為我們提供了很多方式. synchronized、ReentrantLock類(lèi)等。 使用線(xiàn)程安全的數(shù)據(jù)結(jié)構(gòu),例如ConcurrentHashMap、ConcurrentLinkedQueue等

    2024年02月09日
    瀏覽(14)
  • Java并發(fā)編程學(xué)習(xí)18-線(xiàn)程池的使用(下)

    上篇介紹了 ThreadPoolExecutor 配置和擴(kuò)展相關(guān)的信息,本篇開(kāi)始將介紹遞歸算法的并行化。 還記得我們?cè)凇禞ava并發(fā)編程學(xué)習(xí)11-任務(wù)執(zhí)行演示》中,對(duì)頁(yè)面繪制程序進(jìn)行一系列改進(jìn),這些改進(jìn)大大地提供了頁(yè)面繪制的并行性。 我們簡(jiǎn)單回顧下相關(guān)的改進(jìn)過(guò)程: 第一次新增時(shí),頁(yè)

    2024年02月12日
    瀏覽(24)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包