最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java協(xié)程框架quasar和kotlin中的協(xié)程對比分析

 更新時間:2022年02月24日 17:08:38   作者:kl  
這篇文章主要為大家介紹了java協(xié)程框架quasar和kotlin兩個協(xié)程對比分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多基本

前言

早就聽說Go語言開發(fā)的服務(wù)不用任何架構(gòu)優(yōu)化,就可以輕松實現(xiàn)百萬級別的qps。這得益于Go語言級別的協(xié)程的處理效率。協(xié)程不同于線程,線程是操作系統(tǒng)級別的資源,創(chuàng)建線程,調(diào)度線程,銷毀線程都是重量級別的操作。而且線程的資源有限,在java中大量的不加限制的創(chuàng)建線程非常容易將系統(tǒng)搞垮。接下來要分享的這個開源項目,正是解決了在java中只能使用多線程模型開發(fā)高并發(fā)應(yīng)用的窘境,使得java也能像Go語言那樣使用協(xié)程的語義開發(fā)了。

快速體驗

添加依賴

<dependency>
            <groupId>co.paralleluniverse</groupId>
            <artifactId>quasar-core</artifactId>
            <version>0.7.10</version>
</dependency>

注意:目前quasar最高的版本是0.8.0,但是最高版本的只支持jdk11以上

添加java agent

quasar的實現(xiàn)原理是在java加載class前,通過jdk的instrument機制使用asm來修改目標(biāo)class的字節(jié)碼來實現(xiàn)的,他標(biāo)記了協(xié)程代碼的起始和結(jié)束的位置,以及方法需要暫停的位置,每個協(xié)程任務(wù)統(tǒng)一由FiberScheduler去調(diào)度,內(nèi)部維護了一個或多個ForkJoinPool實例。所以,在運行應(yīng)用前,需要配置好quasar-core的java agent地址,在vm參數(shù)上加上如下腳本即可:

-javaagent:D:\.m2\repository\co\paralleluniverse\quasar-core\0.7.10\quasar-core-0.7.10.jar

線程VS協(xié)程

下面模擬調(diào)用某個遠程的服務(wù),假設(shè)遠程服務(wù)處理耗時需要1S,這里使用執(zhí)行阻塞1S來模擬,分別看多線程模型和協(xié)程模型調(diào)用這個服務(wù)10000次所需的耗時

協(xié)程代碼

public static void main(String[] args) throws Exception{
        CountDownLatch count  = new CountDownLatch(10000);
        StopWatch stopWatch = new StopWatch();stopWatch.start();
        IntStream.range(0,10000).forEach(i-> new Fiber() {
            @Override
            protected String run() throws SuspendExecution, InterruptedException {
                Strand.sleep(1000 );
                count.countDown();
                return  "aa";
            }
        }.start());
        count.await();stopWatch.stop();
        System.out.println("結(jié)束了: " + stopWatch.prettyPrint());
    }

耗時情況:

多線程代碼

public static void main(String[] args) throws Exception{
        CountDownLatch count  = new CountDownLatch(10000);
        StopWatch stopWatch = new StopWatch();stopWatch.start();
        ExecutorService executorService = Executors.newCachedThreadPool();
        IntStream.range(0,10000).forEach(i-> executorService.submit(() -> {
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException ex) { }
            count.countDown();
        }));
        count.await();stopWatch.stop();
        System.out.println("結(jié)束了: " + stopWatch.prettyPrint());
    }

耗時情況

協(xié)程完勝

可以看到上面的結(jié)果,在對比訪問一個耗時1s的服務(wù)10000次時,協(xié)程只需要2秒多,而多線程模型需要4秒多,時效相差了一倍。而且上面多線程編程時,并沒有指定線程池的大小,在實際開發(fā)中是絕不允許的。一般我們會設(shè)置一個固定大小的線程池,因為線程資源是寶貴,線程多了費內(nèi)存還會帶來線程切換的開銷。上面的場景在設(shè)置200個固定大小線程池時。結(jié)果也是可預(yù)見的達到了50多秒。這個結(jié)果足以證明協(xié)程編程ko線程編程了。而且在qps越大時,線程處理的效率和協(xié)程的差距就約明顯,縮小差距的唯一方式就是增加線程數(shù),而這帶來的影響就是內(nèi)存消耗激增。而反觀協(xié)程,基于固定的幾個線程調(diào)度,可以輕松實現(xiàn)百萬級的協(xié)程處理,而且內(nèi)存穩(wěn)穩(wěn)的。

后記

最后,博主以為Quasar只是一個框架層面的東西,所以就又去看了下同樣是jvm語言的kotlin的協(xié)程。他的語言更簡潔,可以直接和java混合使用。跑上面這種實例只需要1秒多。

fun main() {
    val count = CountDownLatch(10000)
    val stopWatch = StopWatch()
    stopWatch.start()
    IntStream.range(0,10000).forEach {
        GlobalScope.launch {
            delay(1000L)
            println(Thread.currentThread().name + "->"+ it)
            count.countDown()
        }
    }
    count.await()
    stopWatch.stop()
    println("結(jié)束了: " + stopWatch.prettyPrint())
}

當(dāng)博主看到這個結(jié)果的時候,有種震驚的趕腳,kotlin的同步模型牛逼呀,瞬時感覺到發(fā)現(xiàn)了java里的騷操作了,可以使用kotlin的協(xié)程來代替java中的多線程操作。因為他們兩個混合開發(fā)毫無壓力。如果行的通,那就太爽了。所以就有下面這個kotlin協(xié)程實現(xiàn)的代碼:

@Service
class KotlinAsyncService(private val weatherService: GetWeatherService,private val demoApplication: DemoApplication){
    val weatherUrl = "http://localhost:8080/demo/mockWeatherApi?city="
    fun getHuNanWeather(): JSONObject{
        val result = JSONObject()
        val count = CountDownLatch(demoApplication.weatherContext.size)
        for (city in demoApplication.weatherContext){
            val url = weatherUrl + city.key
            GlobalScope.launch {
                result[city.key.toString()] = weatherService.get(url)
                count.countDown()
            }
        }
        count.await()
        return result
    }
}

現(xiàn)實是,當(dāng)我使用協(xié)程替換掉我java多線程寫的一個多線程匯聚多個http接口的結(jié)果的接口時,通過ab壓測他們兩個的性能并沒有很大的變化,最后了解到主要原因是這個時候,在協(xié)程里發(fā)起一個http的請求時,涉及到操作系統(tǒng)層面的socket io操作,io操作是阻塞的,協(xié)程的并發(fā)也就變成了調(diào)度協(xié)程的幾個線程的并發(fā)了。而且當(dāng)我把同樣的代碼放到Quasar中的時候,Quasar直接拋io異常了,說明Quasar還并不能輕松支持這個場景。那為什么上面的測試結(jié)果差距這么大呢,是因為我錯誤的把協(xié)程實現(xiàn)里的阻塞等同于線程的阻塞。協(xié)程里的delay掛起函數(shù),會立馬釋放線程到線程池,但是當(dāng)真正的io阻塞的時候也就和真正的線程sleep一樣了,并沒有釋放當(dāng)前的線程。所以這些對比都沒有太大的意義

以上就是java協(xié)程框架quasar和kotlin中的協(xié)程對比分析的詳細內(nèi)容,更多關(guān)于java框架quasar和kotlin協(xié)程對比的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot整合Redis、ApachSolr和SpringSession的示例

    SpringBoot整合Redis、ApachSolr和SpringSession的示例

    本篇文章主要介紹了SpringBoot整合Redis、ApachSolr和SpringSession的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • Mybatis之RowBounds分頁原理詳解

    Mybatis之RowBounds分頁原理詳解

    這篇文章主要介紹了Mybatis之RowBounds分頁原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Java設(shè)計模式之java責(zé)任鏈模式詳解

    Java設(shè)計模式之java責(zé)任鏈模式詳解

    這篇文章主要介紹了JAVA 責(zé)任鏈模式的的相關(guān)資料,文中講解非常細致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2021-09-09
  • Java 在PPT中添加混合圖表過程詳解

    Java 在PPT中添加混合圖表過程詳解

    這篇文章主要介紹了Java 在PPT中添加混合圖表過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • Java中String、StringBuffer、StringBuilder的區(qū)別介紹

    Java中String、StringBuffer、StringBuilder的區(qū)別介紹

    這篇文章主要介紹了Java中String、StringBuffer、StringBuilder的區(qū)別介紹,本文講解了可變與不可變、是否多線程安全、gBuilder與StringBuffer共同點等內(nèi)容,需要的朋友可以參考下
    2015-06-06
  • java中equals和等號(==)的區(qū)別淺談

    java中equals和等號(==)的區(qū)別淺談

    java中equals和等號(==)的區(qū)別淺談,需要的朋友可以參考一下
    2013-05-05
  • java this引用逃逸詳解

    java this引用逃逸詳解

    這篇文章主要介紹了java this引用逃逸的相關(guān)資料,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-12-12
  • 基于字符串常用API(詳解)

    基于字符串常用API(詳解)

    下面小編就為大家?guī)硪黄谧址S肁PI(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • java實現(xiàn)簡單猜數(shù)字游戲

    java實現(xiàn)簡單猜數(shù)字游戲

    這篇文章主要介紹了java實現(xiàn)簡單猜數(shù)字游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • IDEA中沒有Mapper.xml模板選項的處理方法

    IDEA中沒有Mapper.xml模板選項的處理方法

    這篇文章主要介紹了IDEA中沒有Mapper.xml模板選項的處理方法,需其實解決方法很簡單,只需要在idea中導(dǎo)入模板即可,本文圖文的形式給大家分享解決方法,需要的朋友可以參考下
    2021-04-04

最新評論

南丹县| 遂平县| 山东省| 鱼台县| 垦利县| 水城县| 南木林县| 汉寿县| 资兴市| 罗田县| 启东市| 舒兰市| 青河县| 习水县| 保靖县| 长子县| 嘉义市| 鲜城| 佛坪县| 平凉市| 海南省| 万载县| 乌海市| 屏山县| 鄱阳县| 德钦县| 丹阳市| 阳西县| 疏勒县| 辽宁省| 清镇市| 阿克苏市| 清远市| 阆中市| 南阳市| 广南县| 含山县| 娄底市| 泸水县| 板桥市| 逊克县|