国产chinesehdxxxx老太婆,办公室玩弄爆乳女秘hd,扒开腿狂躁女人爽出白浆 ,丁香婷婷激情俺也去俺来也,ww国产内射精品后入国产

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

公司項目中Java的多線程一般用在哪些場景?

Android編程精選 ? 來源:Android編程精選 ? 2023-02-10 11:47 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

多線程使用的主要目的在于:1、吞吐量:你做WEB,容器幫你做了多線程,但是他只能幫你做請求層面的。簡單的說,可能就是一個請求一個線程?;蚨鄠€請求一個線程。如果是單線程,那同時只能處理一個用戶的請求。2、伸縮性:也就是說,你可以通過增加CPU核數(shù)來提升性能。如果是單線程,那程序執(zhí)行到死也就利用了單核,肯定沒辦法通過增加CPU核數(shù)來提升性能。 鑒于是做WEB的,第1點可能你幾乎不涉及。那這里我就講第二點吧。

舉個簡單的例子:

假設(shè)有個請求,這個請求服務(wù)端的處理需要執(zhí)行3個很緩慢的IO操作(比如數(shù)據(jù)庫查詢或文件查詢),那么正常的順序可能是(括號里面代表執(zhí)行時間):
  1. 讀取文件1 (10ms)
  2. 處理1的數(shù)據(jù)(1ms)
  3. 讀取文件2 (10ms)
  4. 處理2的數(shù)據(jù)(1ms)
  5. 讀取文件3 (10ms)
  6. 處理3的數(shù)據(jù)(1ms)
  7. 整合1、2、3的數(shù)據(jù)結(jié)果 (1ms)
單線程總共就需要34ms。 那如果你在這個請求內(nèi),把ab、cd、ef分別分給3個線程去做,就只需要12ms了。 所以多線程不是沒怎么用,而是,你平常要善于發(fā)現(xiàn)一些可優(yōu)化的點。然后評估方案是否應(yīng)該使用。假設(shè)還是上面那個相同的問題:但是每個步驟的執(zhí)行時間不一樣了。
  1. 讀取文件1 (1ms)
  2. 處理1的數(shù)據(jù)(1ms)
  3. 讀取文件2 (1ms)
  4. 處理2的數(shù)據(jù)(1ms)
  5. 讀取文件3 (28ms)
  6. 處理3的數(shù)據(jù)(1ms)
  7. 整合1、2、3的數(shù)據(jù)結(jié)果 (1ms)
單線程總共就需要34ms。 如果還是按上面的劃分方案(上面方案和木桶原理一樣,耗時取決于最慢的那個線程的執(zhí)行速度),在這個例子中是第三個線程,執(zhí)行29ms。那么最后這個請求耗時是30ms。比起不用單線程,就節(jié)省了4ms。但是有可能線程調(diào)度切換也要花費個1、2ms。因此,這個方案顯得優(yōu)勢就不明顯了,還帶來程序復(fù)雜度提升。不太值得。 那么現(xiàn)在優(yōu)化的點,就不是第一個例子那樣的任務(wù)分割多線程完成。而是優(yōu)化文件3的讀取速度??赡苁遣捎镁彺婧蜏p少一些重復(fù)讀取。 首先,假設(shè)有一種情況,所有用戶都請求這個請求,那其實相當(dāng)于所有用戶都需要讀取文件3。那你想想,100個人進行了這個請求,相當(dāng)于你花在讀取這個文件上的時間就是28×100=2800ms了。那么,如果你把文件緩存起來,那只要第一個用戶的請求讀取了,第二個用戶不需要讀取了,從內(nèi)存取是很快速的,可能1ms都不到。

偽代碼:


		
			publicclassMyServletextendsServlet{ privatestaticMapfileName2Data=newHashMap(); privatevoidprocessFile3(StringfName){ Stringdata=fileName2Data.get(fName); if(data==null){ data=readFromFile(fName);//耗時28ms fileName2Data.put(fName,data); } //processwithdata } }
			看起來好像還不錯,建立一個文件名和文件數(shù)據(jù)的映射。如果讀取一個map中已經(jīng)存在的數(shù)據(jù),那么就不不用讀取文件了。
			可是問題在于,Servlet是并發(fā),上面會導(dǎo)致一個很嚴(yán)重的問題,死循環(huán)。因為,HashMap在并發(fā)修改的時候,可能是導(dǎo)致循環(huán)鏈表的構(gòu)成?。。。ň唧w你可以自行閱讀HashMap源碼)如果你沒接觸過多線程,可能到時候發(fā)現(xiàn)服務(wù)器沒請求也巨卡,也不知道什么情況!
			好的,那就用ConcurrentHashMap,正如他的名字一樣,他是一個線程安全的HashMap,這樣能輕松解決問題。

		
			publicclassMyServletextendsServlet{ privatestaticConcurrentHashMapfileName2Data=newConcurrentHashMap(); privatevoidprocessFile3(StringfName){ Stringdata=fileName2Data.get(fName); if(data==null){ data=readFromFile(fName);//耗時28ms fileName2Data.put(fName,data); } //processwithdata } }
			這樣真的解決問題了嗎,這樣雖然只要有用戶訪問過文件a,那另一個用戶想訪問文件a,也會從fileName2Data中拿數(shù)據(jù),然后也不會引起死循環(huán)。最新 Java 面試題出爐!分享給你。
			可是,如果你覺得這樣就已經(jīng)完了,那你把多線程也想的太簡單了,騷年!你會發(fā)現(xiàn),1000個用戶首次訪問同一個文件的時候,居然讀取了1000次文件(這是最極端的,可能只有幾百)。What the ***in hell!!!
			難道代碼錯了嗎,難道我就這樣過我的一生!
			好好分析下。Servlet是多線程的,那么

		
			publicclassMyServletextendsServlet{ privatestaticConcurrentHashMapfileName2Data=newConcurrentHashMap(); privatevoidprocessFile3(StringfName){ Stringdata=fileName2Data.get(fName); //“偶然”--1000個線程同時到這里,同時發(fā)現(xiàn)data為null if(data==null){ data=readFromFile(fName);//耗時28ms fileName2Data.put(fName,data); } //processwithdata } }
			上面注釋的“偶然”,這是完全有可能的,因此,這樣做還是有問題。
			因此,可以自己簡單的封裝一個任務(wù)來處理。

		
			publicclassMyServletextendsServlet{ privatestaticConcurrentHashMapfileName2Data=newConcurrentHashMap(); privatestaticExecutorServiceexec=Executors.newCacheThreadPool(); privatevoidprocessFile3(StringfName){ FutureTaskdata=fileName2Data.get(fName); //“偶然”--1000個線程同時到這里,同時發(fā)現(xiàn)data為null if(data==null){ data=newFutureTask(fName); FutureTaskold=fileName2Data.putIfAbsent(fName,data); if(old==null){ data=old; }else{ exec.execute(data); } } Stringd=data.get(); //processwithdata } privateFutureTasknewFutureTask(finalStringfile){ returnnewFutureTask(newCallable(){ publicStringcall(){ returnreadFromFile(file); } privateStringreadFromFile(Stringfile){return"";} } } }
			以上所有代碼都是直接在bbs打出來的,不保證可以直接運行。
			多線程最多的場景:web服務(wù)器本身;各種專用服務(wù)器(如游戲服務(wù)器);

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    13

    文章

    9795

    瀏覽量

    87993
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    2989

    瀏覽量

    109723
  • 多線程
    +關(guān)注

    關(guān)注

    0

    文章

    279

    瀏覽量

    20444

原文標(biāo)題:面試官:公司項目中Java的多線程一般用在哪些場景?

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    Java多線程的用法

    本文將介紹Java多線程的用法。 基礎(chǔ)介紹 什么是多線程 指的是在個進程中同時運行多個線程
    的頭像 發(fā)表于 09-30 17:07 ?1229次閱讀

    Java直獨得恩寵的秘訣

    Java中沒有指針,這樣就沒有辦法直接訪問內(nèi)存了。另外Java也不容易出現(xiàn)內(nèi)存泄露。而且Java確實有很多企業(yè)在用,都是用在項目上。這就意
    發(fā)表于 09-28 14:24

    請問SPI接口一般都是用在哪里的?

    SPI接口一般都是用在哪里的?如何用?
    發(fā)表于 09-25 05:55

    Java基礎(chǔ)學(xué)習(xí)多線程使用指南

    黑馬程序員-----Java基礎(chǔ)學(xué)習(xí)多線程
    發(fā)表于 10-08 14:10

    java多線程編程實例 (源程序)

    java多線程編程實例 import java.awt.*;import javax.swing.*; public class CompMover extends Object { 
    發(fā)表于 10-22 11:48 ?0次下載

    java多線程設(shè)計模式_結(jié)城浩

    JAVA多線程設(shè)計模式》通過淺顯易懂的文字與實例來介紹JAVA線程相關(guān)的設(shè)計模式概念,并且通過實際的JAVA程序范例和UML圖示來一一解說
    發(fā)表于 01-05 16:15 ?0次下載
    <b class='flag-5'>java</b><b class='flag-5'>多線程</b>設(shè)計模式_結(jié)城浩

    java 多線程面試題

    問題比較簡單,可以用join方法實現(xiàn)。 2. 在Java中Lock接口比synchronized塊的優(yōu)勢是什么?你需要實現(xiàn)個高效的緩存,它允許多個用戶讀,但只允許個用戶寫,以此來保持它的完整性,你會怎樣去實現(xiàn)它? lock接
    發(fā)表于 09-28 14:18 ?0次下載

    Java多線程總結(jié)之Queue

    Java多線程應(yīng)用中,隊列的使用率很高,多數(shù)生產(chǎn)消費模型的首選數(shù)據(jù)結(jié)構(gòu)就是隊列。Java提供的線程安全的Queue可以分為 阻塞隊列和非阻塞隊列 ,其中阻塞隊列的典型例子
    發(fā)表于 11-28 16:14 ?3502次閱讀
    <b class='flag-5'>Java</b><b class='flag-5'>多線程</b>總結(jié)之Queue

    java學(xué)習(xí)——java面試【事務(wù)、鎖、多線程】資料整理

    本文檔內(nèi)容介紹了基于java學(xué)習(xí)java面試【事務(wù)、鎖、多線程】資料整理,供參考
    發(fā)表于 03-13 13:53 ?0次下載

    滌綸電容一般用在哪里?

    二者是有區(qū)別的!滌綸電容又叫聚酯電容符號為CL,電容量一般40p--4μ, 額定電壓63--630V,主要特點體積小容量大耐熱耐濕但穩(wěn)定性差一般應(yīng)用在對穩(wěn)定性和損耗要求不高的低頻電路。
    發(fā)表于 11-13 09:51 ?4687次閱讀

    EEPROM 在項目中一般會做幾項特殊操作

    EEPROM,在項目中一般會做幾項特殊操作
    的頭像 發(fā)表于 03-04 14:01 ?3391次閱讀
    EEPROM 在<b class='flag-5'>項目中</b>我<b class='flag-5'>一般</b>會做幾項特殊操作

    Java多線程永動任務(wù) 多線程異步任務(wù)項目解讀

    , 這個示例的原型是公司自研的多線程異步任務(wù)項目 ,我把里面涉及到多線程的代碼抽離出來,然后進行定的改造。 里面涉及的知識點非常多,特別適
    的頭像 發(fā)表于 10-19 11:46 ?1353次閱讀

    多線程編程可以應(yīng)用在哪里?C++多線程詳解

    多線程并發(fā)指的是在同個進程中執(zhí)行多個線程。 優(yōu)點: 有操作系統(tǒng)相關(guān)知識的應(yīng)該知道,線程是輕量級的進程,每個線程可以獨立的運行不同的指令序列
    發(fā)表于 04-13 10:10 ?866次閱讀

    紐扣型超級電容器一般用在哪里?

    紐扣型超級電容器一般用在哪里?即便是同種類型的產(chǎn)品,其型號、規(guī)格以及作用都是不同的。所以,大家在選擇產(chǎn)品的時候,也要從細節(jié)方面來考慮。紐扣型超級電容器在市場上是很常見的,它被應(yīng)用在
    的頭像 發(fā)表于 02-24 10:33 ?2746次閱讀
    紐扣型超級電容器<b class='flag-5'>一般</b>是<b class='flag-5'>用在哪</b>里?

    java實現(xiàn)多線程的幾種方式

    Java實現(xiàn)多線程的幾種方式 多線程是指程序中包含了兩個或以上的線程,每個線程都可以并行執(zhí)行不同的任務(wù)或操作。
    的頭像 發(fā)表于 03-14 16:55 ?1336次閱讀