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

Java多線程中的concurrent簡(jiǎn)析

 更新時(shí)間:2023年09月12日 09:06:13   作者:flydean程序那些事  
這篇文章主要介紹了Java多線程中的concurrent簡(jiǎn)析,java.util.concurrent包提供了很多有用的類(lèi),方便我們進(jìn)行并發(fā)程序的開(kāi)發(fā),本文將會(huì)挑選其中常用的一些類(lèi)來(lái)進(jìn)行大概的說(shuō)明,需要的朋友可以參考下

主要的組件

java.util.concurrent包含了很多內(nèi)容, 本文將會(huì)挑選其中常用的一些類(lèi)來(lái)進(jìn)行大概的說(shuō)明:

  • Executor
  • ExecutorService
  • ScheduledExecutorService
  • Future
  • CountDownLatch
  • CyclicBarrier
  • Semaphore
  • ThreadFactory

Executor

Executor是一個(gè)接口,它定義了一個(gè)execute方法,這個(gè)方法接收一個(gè)Runnable,并在其中調(diào)用Runnable的run方法。

我們看一個(gè)Executor的實(shí)現(xiàn):

public class Invoker implements Executor {
    @Override
    public void execute(Runnable r) {
        r.run();
    }
}

現(xiàn)在我們可以直接調(diào)用該類(lèi)中的方法:

    public void execute() {
        Executor executor = new Invoker();
        executor.execute( () -> {
            log.info("{}", Thread.currentThread().toString());
        });
    }

注意,Executor并不一定要求執(zhí)行的任務(wù)是異步的。

ExecutorService

如果我們真正的需要使用多線程的話,那么就需要用到ExecutorService了。

ExecutorService管理了一個(gè)內(nèi)存的隊(duì)列,并定時(shí)提交可用的線程。

我們首先定義一個(gè)Runnable類(lèi):

public class Task implements Runnable {
    @Override
    public void run() {
        // task details
    }
}

我們可以通過(guò)Executors來(lái)方便的創(chuàng)建ExecutorService:

ExecutorService executor = Executors.newFixedThreadPool(10);

上面創(chuàng)建了一個(gè)ThreadPool, 我們也可以創(chuàng)建單線程的ExecutorService:

ExecutorService executor =Executors.newSingleThreadExecutor();

我們這樣提交task:

public void execute() { 
    executor.submit(new Task()); 
}

因?yàn)镋xecutorService維持了一個(gè)隊(duì)列,所以它不會(huì)自動(dòng)關(guān)閉, 我們需要調(diào)用executor.shutdown() 或者executor.shutdownNow()來(lái)關(guān)閉它。

如果想要判斷ExecutorService中的線程在收到shutdown請(qǐng)求后是否全部執(zhí)行完畢,可以調(diào)用如下的方法:

try {
            executor.awaitTermination( 5l, TimeUnit.SECONDS );
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

ScheduledExecutorService

ScheduledExecutorService和ExecutorService很類(lèi)似,但是它可以周期性的執(zhí)行任務(wù)。

我們這樣創(chuàng)建ScheduledExecutorService:

ScheduledExecutorService executorService
                = Executors.newSingleThreadScheduledExecutor();

executorService的schedule方法,可以傳入Runnable也可以傳入Callable:

Future<String> future = executorService.schedule(() -> {
        // ...
        return "Hello world";
    }, 1, TimeUnit.SECONDS);
    ScheduledFuture<?> scheduledFuture = executorService.schedule(() -> {
        // ...
    }, 1, TimeUnit.SECONDS);

還有兩個(gè)比較相近的方法:

scheduleAtFixedRate( Runnable command, long initialDelay, long period, TimeUnit unit )
scheduleWithFixedDelay( Runnable command, long initialDelay, long delay, TimeUnit unit ) 

兩者的區(qū)別是前者的period是以任務(wù)開(kāi)始時(shí)間來(lái)計(jì)算的,后者是以任務(wù)結(jié)束時(shí)間來(lái)計(jì)算。

Future

Future用來(lái)獲取異步執(zhí)行的結(jié)果??梢哉{(diào)用cancel(boolean mayInterruptIfRunning) 方法來(lái)取消線程的執(zhí)行。

我們看下怎么得到一個(gè)Future對(duì)象:

public void invoke() {
    ExecutorService executorService = Executors.newFixedThreadPool(10);
    Future<String> future = executorService.submit(() -> {
        // ...
        Thread.sleep(10000l);
        return "Hello world";
    });
}

我們看下怎么獲取Future的結(jié)果:

if (future.isDone() && !future.isCancelled()) {
    try {
        str = future.get();
    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
    }
}

future還可以接受一個(gè)時(shí)間參數(shù),超過(guò)指定的時(shí)間,將會(huì)報(bào)TimeoutException。

try {
    future.get(10, TimeUnit.SECONDS);
} catch (InterruptedException | ExecutionException | TimeoutException e) {
    e.printStackTrace();
}

CountDownLatch

CountDownLatch是一個(gè)并發(fā)中很有用的類(lèi),CountDownLatch會(huì)初始化一個(gè)counter,通過(guò)這個(gè)counter變量,來(lái)控制資源的訪問(wèn)。

我們會(huì)在后面的文章詳細(xì)介紹。

CyclicBarrier

CyclicBarrier和CountDownLatch很類(lèi)似。CyclicBarrier主要用于多個(gè)線程互相等待的情況,可以通過(guò)調(diào)用await() 方法等待,知道達(dá)到要等的數(shù)量。

public class Task implements Runnable {
    private CyclicBarrier barrier;
    public Task(CyclicBarrier barrier) {
        this.barrier = barrier;
    }
    @Override
    public void run() {
        try {
            LOG.info(Thread.currentThread().getName() + 
              " is waiting");
            barrier.await();
            LOG.info(Thread.currentThread().getName() + 
              " is released");
        } catch (InterruptedException | BrokenBarrierException e) {
            e.printStackTrace();
        }
    }
}
public void start() {
    CyclicBarrier cyclicBarrier = new CyclicBarrier(3, () -> {
        // ...
        LOG.info("All previous tasks are completed");
    });
    Thread t1 = new Thread(new Task(cyclicBarrier), "T1"); 
    Thread t2 = new Thread(new Task(cyclicBarrier), "T2"); 
    Thread t3 = new Thread(new Task(cyclicBarrier), "T3"); 
    if (!cyclicBarrier.isBroken()) { 
        t1.start(); 
        t2.start(); 
        t3.start(); 
    }
}

Semaphore

Semaphore包含了一定數(shù)量的許可證,通過(guò)獲取許可證,從而獲得對(duì)資源的訪問(wèn)權(quán)限。通過(guò) tryAcquire()來(lái)獲取許可,如果獲取成功,許可證的數(shù)量將會(huì)減少。

一旦線程release()許可,許可的數(shù)量將會(huì)增加。

我們看下怎么使用:

static Semaphore semaphore = new Semaphore(10);
public void execute() throws InterruptedException {
    LOG.info("Available permit : " + semaphore.availablePermits());
    LOG.info("Number of threads waiting to acquire: " + 
      semaphore.getQueueLength());
    if (semaphore.tryAcquire()) {
        try {
            // ...
        }
        finally {
            semaphore.release();
        }
    }
}

ThreadFactory

ThreadFactory可以很方便的用來(lái)創(chuàng)建線程:

public class ThreadFactoryUsage implements ThreadFactory {
    private int threadId;
    private String name;
    public ThreadFactoryUsage(String name) {
        threadId = 1;
        this.name = name;
    }
    @Override
    public Thread newThread(Runnable r) {
        Thread t = new Thread(r, name + "-Thread_" + threadId);
        log.info("created new thread with id : " + threadId +
                " and name : " + t.getName());
        threadId++;
        return t;
    }
}

到此這篇關(guān)于Java多線程中的concurrent簡(jiǎn)析的文章就介紹到這了,更多相關(guān)concurrent簡(jiǎn)析內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot實(shí)現(xiàn)發(fā)送郵件功能過(guò)程圖解

    SpringBoot實(shí)現(xiàn)發(fā)送郵件功能過(guò)程圖解

    這篇文章主要介紹了SpringBoot實(shí)現(xiàn)發(fā)送郵件功能過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 使用Java實(shí)現(xiàn)6種常見(jiàn)負(fù)載均衡算法

    使用Java實(shí)現(xiàn)6種常見(jiàn)負(fù)載均衡算法

    Java負(fù)載均衡算法也是分布式系統(tǒng)中的重要組成部分,用于將來(lái)自客戶(hù)端的請(qǐng)求分配到不同的后端服務(wù)器上,本文將介紹常見(jiàn)的Java負(fù)載均衡算法,輪詢(xún)法、加權(quán)隨機(jī)法……一次性讓你了解?6?種常見(jiàn)負(fù)載均衡算法
    2023-06-06
  • MyBatis基本實(shí)現(xiàn)過(guò)程

    MyBatis基本實(shí)現(xiàn)過(guò)程

    這篇文章主要介紹了Spring整合mybatis實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-07-07
  • SpringBoot實(shí)現(xiàn)異步調(diào)用的方法示例

    SpringBoot實(shí)現(xiàn)異步調(diào)用的方法示例

    本文介紹了在Java的SpringBoot中實(shí)現(xiàn)異步請(qǐng)求和異步調(diào)用的幾種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • 詳解Spring循環(huán)依賴(lài)的解決方案

    詳解Spring循環(huán)依賴(lài)的解決方案

    這篇文章主要介紹了詳解Spring循環(huán)依賴(lài)的解決方案,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Java拷貝機(jī)制之深拷貝、淺拷貝與零拷貝詳解

    Java拷貝機(jī)制之深拷貝、淺拷貝與零拷貝詳解

    本文詳細(xì)介紹了Java中三種拷貝機(jī)制:淺拷貝、深拷貝和零拷貝,包括它們的核心概念、實(shí)現(xiàn)方式和適用場(chǎng)景,通過(guò)實(shí)戰(zhàn)案例和性能測(cè)試,幫助開(kāi)發(fā)者根據(jù)具體需求選擇最優(yōu)的拷貝策略,需要的朋友可以參考下
    2026-02-02
  • StringBuilder如何拼接(截取)想要的字符串

    StringBuilder如何拼接(截取)想要的字符串

    文章主要介紹了Java中字符串操作的兩種常用類(lèi)StringBuilder和StringBuffer,以及三元表達(dá)式的使用和字符串截取的方法
    2024-12-12
  • Java反射實(shí)現(xiàn)多屬性去重與分組功能

    Java反射實(shí)現(xiàn)多屬性去重與分組功能

    在Java開(kāi)發(fā)中,??List是一種非常常用的數(shù)據(jù)結(jié)構(gòu),通常我們會(huì)遇到這樣的問(wèn)題:如何處理??List???中的相同字段?無(wú)論是去重還是分組,合理的操作可以提高代碼的性能和可讀性,本文將詳細(xì)介紹如何基于反射的Java集合動(dòng)態(tài)去重與分組功能,需要的朋友可以參考下
    2025-06-06
  • 關(guān)于Maven依賴(lài)沖突解決之exclusions

    關(guān)于Maven依賴(lài)沖突解決之exclusions

    這篇文章主要介紹了關(guān)于Maven依賴(lài)沖突解決之exclusions用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Kafka調(diào)試技巧及心得分享

    Kafka調(diào)試技巧及心得分享

    Kafka消費(fèi)組機(jī)制確保每個(gè)消息只被一個(gè)消費(fèi)者消費(fèi),新增機(jī)器時(shí)根據(jù)策略分配分區(qū),本地調(diào)試時(shí),修改代碼后可能需要重新測(cè)試和造消息,但可以通過(guò)配置參數(shù)控制消費(fèi)偏移量,線上環(huán)境調(diào)試可以通過(guò)接口拉取處理
    2026-02-02

最新評(píng)論

会泽县| 石首市| 蛟河市| 福海县| 铜川市| 阿拉善左旗| 海口市| 江口县| 商南县| 车险| 许昌市| 孟连| 涡阳县| 乐东| 永吉县| 望奎县| 永嘉县| 新野县| 綦江县| 濮阳县| 淅川县| 喀喇| 曲阜市| 连平县| 文昌市| 安丘市| 乳山市| 苏尼特右旗| 和平区| 温宿县| 屏山县| 嘉荫县| 毕节市| 徐汇区| 双桥区| 信丰县| 耿马| 桑植县| 且末县| 涡阳县| 金堂县|