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

java基于quasar實現(xiàn)協(xié)程池的方法示例

 更新時間:2022年06月22日 08:40:29   作者:爪哇盤古  
本文主要介紹了java基于quasar實現(xiàn)協(xié)程池的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧<BR>

業(yè)務(wù)場景:golang與swoole都擁抱了協(xié)程,在同任務(wù)并發(fā)數(shù)量下,協(xié)程可比線程多幾倍。所以最近在查詢java時了解java本身是沒有協(xié)程的,但是某牛自行實現(xiàn)了協(xié)程,也就是本文的主角quasar(纖程)!在csdn中基本都是對它的基本使用,用法和線程差不多。不過沒看到誰公開一下手寫協(xié)程池的騷操作(誰會直接new它用?那是沒挨過社會的毒打呀~)

一個線程可以多個協(xié)程,一個進程也可以單獨擁有多個協(xié)程。

線程進程都是同步機制,而協(xié)程則是異步。

協(xié)程能保留上一次調(diào)用時的狀態(tài),每次過程重入時,就相當(dāng)于進入上一次調(diào)用的狀態(tài)。

線程是搶占式,而協(xié)程是非搶占式的,所以需要用戶自己釋放使用權(quán)來切換到其他協(xié)程,因此同一時間其實只有一個協(xié)程擁有運行權(quán),相當(dāng)于單線程的能力。

協(xié)程并不是取代線程, 而且抽象于線程之上, 線程是被分割的CPU資源, 協(xié)程是組織好的代碼流程, 協(xié)程需要線程來承載運行, 線程是協(xié)程的資源, 但協(xié)程不會直接使用線程, 協(xié)程直接利用的是執(zhí)行器(Interceptor), 執(zhí)行器可以關(guān)聯(lián)任意線程或線程池, 可以使當(dāng)前線程, UI線程, 或新建新程.。

線程是協(xié)程的資源。協(xié)程通過Interceptor來間接使用線程這個資源。

廢話不多說,直接上代碼:

導(dǎo)入包:

        <dependency>
            <groupId>co.paralleluniverse</groupId>
            <artifactId>quasar-core</artifactId>
            <version>0.7.9</version>
            <classifier>jdk8</classifier>
        </dependency>

WorkTools工具類:

package com.example.ai;
?
import co.paralleluniverse.fibers.Fiber;
import co.paralleluniverse.fibers.SuspendExecution;
import co.paralleluniverse.strands.SuspendableRunnable;
?
import java.util.concurrent.ArrayBlockingQueue;
?
?
public class WorkTools {
? ? //協(xié)程池中默認(rèn)協(xié)程的個數(shù)為5
? ? private static int WORK_NUM = 5;
? ? //隊列默認(rèn)任務(wù)為100
? ? private static int TASK_COUNT = 100;
?
? ? //工做協(xié)程數(shù)組
? ? private Fiber[] workThreads;
? ? //等待隊列
? ? private final ArrayBlockingQueue<SuspendableRunnable> taskQueue;
?
? ? //用戶在構(gòu)造這個協(xié)程池時,但愿啟動的協(xié)程數(shù)
? ? private final int workerNum;
?
?
? ? //構(gòu)造方法:建立具備默認(rèn)協(xié)程個數(shù)的協(xié)程池
? ? public WorkTools() {
? ? ? ? this(WORK_NUM,TASK_COUNT);
? ? }
?
? ? //建立協(xié)程池,workNum為協(xié)程池中工做協(xié)程的個數(shù)
? ? public WorkTools(int workerNum, int taskCount) {
? ? ? ? if (workerNum <= 0) {
? ? ? ? ? ? workerNum = WORK_NUM;
? ? ? ? }
? ? ? ? if (taskCount <= 0) {
? ? ? ? ? ? taskCount = TASK_COUNT;
? ? ? ? }
? ? ? ? this.workerNum = workerNum;
? ? ? ? taskQueue = new ArrayBlockingQueue(taskCount);
? ? ? ? workThreads = new Fiber[workerNum];
? ? ? ? for (int i = 0; i < workerNum; i++) {
? ? ? ? ? ? int finalI = i;
? ? ? ? ? ? workThreads[i] = new Fiber<>(new SuspendableRunnable() {
? ? ? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? public void run() throws SuspendExecution, InterruptedException {
? ? ? ? ? ? ? ? ? ? SuspendableRunnable runnable = null;
? ? ? ? ? ? ? ? ? ? while (true){
? ? ? ? ? ? ? ? ? ? ? ? try{
? ? ? ? ? ? ? ? ? ? ? ? ? ? //取任務(wù),沒有則阻塞。
? ? ? ? ? ? ? ? ? ? ? ? ? ? runnable = taskQueue.take();
? ? ? ? ? ? ? ? ? ? ? ? }catch (Exception e){
? ? ? ? ? ? ? ? ? ? ? ? ? ? System.out.println(e.getMessage());
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? //存在任務(wù)則運行。
? ? ? ? ? ? ? ? ? ? ? ? if(runnable != null){
? ? ? ? ? ? ? ? ? ? ? ? ? ? runnable.run();
? ? ? ? ? ? ? ? ? ? ? ? }
?
? ? ? ? ? ? ? ? ? ? ? ? runnable = null;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }); ?//new一個工做協(xié)程
?
? ? ? ? ? ? workThreads[i].start(); ?//啟動工做協(xié)程
?
? ? ? ? }
?
? ? ? ? Runtime.getRuntime().availableProcessors();
? ? }
? ? //執(zhí)行任務(wù),其實就是把任務(wù)加入任務(wù)隊列,何時執(zhí)行由協(xié)程池管理器決定
? ? public void execute(SuspendableRunnable task) {
? ? ? ? try {
? ? ? ? ? ? taskQueue.put(task); ? //put:阻塞接口的插入
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? // TODO: handle exception
? ? ? ? ? ? System.out.println("阻塞");
? ? ? ? }
? ? }
? ? //銷毀協(xié)程池,該方法保證全部任務(wù)都完成的狀況下才銷毀全部協(xié)程,不然等待任務(wù)完成再銷毀
? ? public void destory() {
? ? ? ? //工做協(xié)程中止工做,且置為null
? ? ? ? System.out.println("ready close thread...");
? ? ? ? for (int i = 0; i < workerNum; i++) {
?
? ? ? ? ? ? workThreads[i] = null; //help gc
? ? ? ? }
? ? ? ? taskQueue.clear(); ?//清空等待隊列
? ? }
? ? //覆蓋toString方法,返回協(xié)程信息:工做協(xié)程個數(shù)和已完成任務(wù)個數(shù)
? ? @Override
? ? public String toString() {
? ? ? ? return "WorkThread number:" + workerNum + " ==分割線== wait task number:" + taskQueue.size();
? ? }
}

測試代碼:

package com.example.ai;
 
import co.paralleluniverse.strands.SuspendableRunnable;
import lombok.SneakyThrows;
 
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
import java.util.concurrent.CountDownLatch;
 
 
 
@SpringBootApplication
 
 
public class AiApplication {
 
    @SneakyThrows
    public static void main(String[] args) {
        //等待協(xié)程任務(wù)完畢后再結(jié)束主線程
        CountDownLatch cdl = new CountDownLatch(50);
        //開啟5個協(xié)程,50個任務(wù)列隊。
        WorkTools myThreadPool = new WorkTools(5, 50);
        for (int i = 0; i< 50; i++){
            int finalI = i;
            myThreadPool.execute(new SuspendableRunnable() {
                @Override
                public void run() {
                    System.out.println(finalI);
                    try {
                        //延遲1秒
                        Thread.sleep(1000);
                        cdl.countDown();
                    } catch (InterruptedException e) {
                        System.out.println("阻塞中");
                    }
                }
            });
 
        }
        //阻塞
        cdl.await();
    }
 
}

具體代碼都有注釋了,自行了解。我也是以線程池寫法實現(xiàn)。

當(dāng)前為解決問題:在協(xié)程阻塞過程中Fiber類會報阻塞警告,滿臉懵逼啊,看著很討厭。暫時沒有辦法處理,看各位大神誰有招下方評論提供給下思路。萬分感謝~

到此這篇關(guān)于java基于quasar實現(xiàn)協(xié)程池的方法示例的文章就介紹到這了,更多相關(guān)java quasar協(xié)程池內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Dom4j解析XML_動力節(jié)點Java學(xué)院整理

    Dom4j解析XML_動力節(jié)點Java學(xué)院整理

    這篇文章主要介紹了Dom4j解析XML,dom4j是一個Java的XML API,類似于jdom,用來讀寫XML文件的,有興趣的可以了解一下
    2017-07-07
  • 一篇文章帶你深入了解Java對象與Java類

    一篇文章帶你深入了解Java對象與Java類

    這篇文章主要給大家介紹了關(guān)于java中類和對象的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • MyBatis中 #{} 和 ${} 的區(qū)別小結(jié)

    MyBatis中 #{} 和 ${} 的區(qū)別小結(jié)

    MyBatis中#{}和${}是兩種占位符,本文就來介紹一下MyBatis中 #{} 和 ${} 的區(qū)別小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • java.lang.UnsatisfiedLinkError: %1 不是有效的Win32應(yīng)用程序錯誤解決

    java.lang.UnsatisfiedLinkError: %1 不是有效的Win32應(yīng)用程序錯誤解決

    這篇文章主要給大家介紹了關(guān)于java.lang.UnsatisfiedLinkError: %1 不是有效的Win32應(yīng)用程序錯誤的解決方法,文中介紹的非常詳細(xì),需要的朋友們可以參考學(xué)習(xí),下面來一起看看吧。
    2017-03-03
  • 在Java中將List轉(zhuǎn)換為String輸出過程解析

    在Java中將List轉(zhuǎn)換為String輸出過程解析

    這篇文章主要介紹了在Java中將List轉(zhuǎn)換為String輸出過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • 解決spring boot環(huán)境切換失效的問題

    解決spring boot環(huán)境切換失效的問題

    這篇文章主要介紹了解決spring boot環(huán)境切換失效的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 升級dubbo2.7.4.1版本平滑遷移到注冊中心nacos

    升級dubbo2.7.4.1版本平滑遷移到注冊中心nacos

    這篇文章主要為大家介紹了2.7.4.1的dubbo平滑遷移到注冊中心nacos的兩種版本升級方案,以及為什要升級,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-02-02
  • 圖解Java排序算法之希爾排序

    圖解Java排序算法之希爾排序

    這篇文章主要為大家詳細(xì)介紹了Java排序算法之希爾排序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Java join 線程控制用法

    Java join 線程控制用法

    Java join 線程控制用法,需要的朋友可以參考一下
    2013-03-03
  • 解決Spring?MVC中文亂碼的編碼配置

    解決Spring?MVC中文亂碼的編碼配置

    這篇文章主要為大家介紹了解決SpringMVC中文亂碼的編碼配置示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10

最新評論

林周县| 建昌县| 西乌珠穆沁旗| 离岛区| 独山县| 克东县| 大港区| 长垣县| 西乌珠穆沁旗| 隆安县| 喜德县| 新疆| 平阴县| 桃园县| 昆山市| 讷河市| 永吉县| 安泽县| 闻喜县| 镇宁| 长丰县| 邵武市| 明光市| 大同县| 青田县| 霍州市| 榆中县| 乌什县| 贺州市| 东平县| 康保县| 班戈县| 鄄城县| 曲沃县| 天柱县| 博爱县| 嘉定区| 达孜县| 兰溪市| 皋兰县| 定远县|