亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

一個(gè)線程可以多個(gè)協(xié)程,一個(gè)進(jìn)程也可以單獨(dú)擁有多個(gè)協(xié)程。

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

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

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

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

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

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

導(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é)程的個(gè)數(shù)為5
? ? private static int WORK_NUM = 5;
? ? //隊(duì)列默認(rèn)任務(wù)為100
? ? private static int TASK_COUNT = 100;
?
? ? //工做協(xié)程數(shù)組
? ? private Fiber[] workThreads;
? ? //等待隊(duì)列
? ? private final ArrayBlockingQueue<SuspendableRunnable> taskQueue;
?
? ? //用戶在構(gòu)造這個(gè)協(xié)程池時(shí),但愿啟動(dòng)的協(xié)程數(shù)
? ? private final int workerNum;
?
?
? ? //構(gòu)造方法:建立具備默認(rèn)協(xié)程個(gè)數(shù)的協(xié)程池
? ? public WorkTools() {
? ? ? ? this(WORK_NUM,TASK_COUNT);
? ? }
?
? ? //建立協(xié)程池,workNum為協(xié)程池中工做協(xié)程的個(gè)數(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ù)則運(yùn)行。
? ? ? ? ? ? ? ? ? ? ? ? if(runnable != null){
? ? ? ? ? ? ? ? ? ? ? ? ? ? runnable.run();
? ? ? ? ? ? ? ? ? ? ? ? }
?
? ? ? ? ? ? ? ? ? ? ? ? runnable = null;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }); ?//new一個(gè)工做協(xié)程
?
? ? ? ? ? ? workThreads[i].start(); ?//啟動(dòng)工做協(xié)程
?
? ? ? ? }
?
? ? ? ? Runtime.getRuntime().availableProcessors();
? ? }
? ? //執(zhí)行任務(wù),其實(shí)就是把任務(wù)加入任務(wù)隊(duì)列,何時(shí)執(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(); ?//清空等待隊(duì)列
? ? }
? ? //覆蓋toString方法,返回協(xié)程信息:工做協(xié)程個(gè)數(shù)和已完成任務(wù)個(gè)數(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個(gè)協(xié)程,50個(gè)任務(wù)列隊(duì)。
        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();
    }
 
}

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

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

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

相關(guān)文章

  • 淺析java中Integer傳參方式的問題

    淺析java中Integer傳參方式的問題

    以下是對(duì)java中Integer傳參方式的問題進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下
    2013-09-09
  • 如何使用Java統(tǒng)計(jì)gitlab代碼行數(shù)

    如何使用Java統(tǒng)計(jì)gitlab代碼行數(shù)

    這篇文章主要介紹了如何使用Java統(tǒng)計(jì)gitlab代碼行數(shù),實(shí)現(xiàn)方式通過git腳本將所有的項(xiàng)目拉下來并然后通過進(jìn)行代碼行數(shù)的統(tǒng)計(jì),需要的朋友可以參考下
    2023-10-10
  • 通過weblogic API解析如何獲取weblogic中服務(wù)的IP和端口操作

    通過weblogic API解析如何獲取weblogic中服務(wù)的IP和端口操作

    這篇文章主要介紹了通過weblogic API解析如何獲取weblogic中服務(wù)的IP和端口操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java實(shí)現(xiàn)過濾掉map集合中key或value為空的值示例

    Java實(shí)現(xiàn)過濾掉map集合中key或value為空的值示例

    這篇文章主要介紹了Java實(shí)現(xiàn)過濾掉map集合中key或value為空的值,涉及java針對(duì)map的簡單遍歷、判斷、移除等相關(guān)操作技巧,需要的朋友可以參考下
    2018-06-06
  • Spring集成MyBatis和PageHelper分頁插件整合過程詳解

    Spring集成MyBatis和PageHelper分頁插件整合過程詳解

    Spring?整合?MyBatis?是將?MyBatis?數(shù)據(jù)訪問框架與?Spring?框架進(jìn)行集成,以實(shí)現(xiàn)更便捷的開發(fā)和管理,在集成過程中,Spring?提供了許多特性和功能,如依賴注入、聲明式事務(wù)管理、AOP?等,這篇文章主要介紹了Spring集成MyBatis和PageHelper分頁插件整合,需要的朋友可以參考下
    2023-08-08
  • 數(shù)據(jù)庫基本操作語法歸納總結(jié)

    數(shù)據(jù)庫基本操作語法歸納總結(jié)

    本篇文章主要介紹了數(shù)據(jù)庫的一些常用方法及一些基本操作,需要的朋友可以參考下
    2017-04-04
  • 解決Request.getParameter獲取不到特殊字符bug問題

    解決Request.getParameter獲取不到特殊字符bug問題

    這篇文章主要介紹了解決Request.getParameter獲取不到特殊字符bug問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 詳解Java實(shí)現(xiàn)LRU緩存

    詳解Java實(shí)現(xiàn)LRU緩存

    這篇文章主要介紹了詳解Java實(shí)現(xiàn)LRU緩存,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 淺析Java迭代器Iterator和Iterable的區(qū)別

    淺析Java迭代器Iterator和Iterable的區(qū)別

    Java語言中,Iterator和Iterable都是用來遍歷集合類數(shù)據(jù)結(jié)構(gòu)的接口,雖然它們有很多相似的地方,但在具體實(shí)現(xiàn)中卻有著一些不同之處,本文將詳細(xì)分析它們的區(qū)別,并提供相應(yīng)的代碼示例,需要的朋友可以參考下
    2023-07-07
  • Spring為什么不推薦使用@Autowired注解詳析

    Spring為什么不推薦使用@Autowired注解詳析

    @Autowired 注解的主要功能就是完成自動(dòng)注入,使用也非常簡單,但這篇文章主要給大家介紹了關(guān)于Spring為什么不推薦使用@Autowired注解的相關(guān)資料,需要的朋友可以參考下
    2021-11-11

最新評(píng)論