第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

使用多個(gè)線程僅調(diào)用一次方法

使用多個(gè)線程僅調(diào)用一次方法

HUWWW 2023-02-16 15:46:00
我有一個(gè)同時(shí)處理大量請求的 Web 應(yīng)用程序。在應(yīng)用程序的一個(gè) API 方法中,我有一個(gè)方法 - methodA()。在這個(gè)方法中,我調(diào)用了另一個(gè)方法 - doSomething()。我有一個(gè)場景,我希望對 methodA() 的第一次調(diào)用將在單獨(dú)的線程中運(yùn)行 doSomething() 方法,但此時(shí),如果已調(diào)用對 methodA() 的另一個(gè)調(diào)用,則不要運(yùn)行 doSomething( ) 方法(因?yàn)樗栽谟闪硪粋€(gè)線程運(yùn)行)并繼續(xù) methodA() 的其余部分。methodA() { . . doSomething() // In a new thread . .}我考慮過使用原子布爾值作為標(biāo)志,但我不確定這是否是最好的主意。    private final AtomicBoolean isOn = new AtomicBoolean(false);    methodA() {        .        .        if (isOn.compareAndSet(false, true)) {                     Runnable doSomethingRunnableTask = () -> {                          doSomething(); };                     Thread t1 = new Thread(doSomethingRunnableTask);                     t1.start();                     isOn.set(false);        } 謝謝!
查看完整描述

3 回答

?
UYOU

TA貢獻(xiàn)1878條經(jīng)驗(yàn) 獲得超4個(gè)贊

您可以使用ReentrantLock。鎖一次只允許一個(gè)線程,它的tryLock()方法將根據(jù)是否獲得鎖立即返回 true 或 false。

ReentrantLock lock = new ReentrantLock();


methodA() {

    ...

    if (lock.tryLock()) {

        try {

            doSomething();

        } finally {

            lock.unlock();

        }

    }

    ...

}

如果您想doSomething()在另一個(gè)線程中執(zhí)行,并且不想阻塞任何調(diào)用線程,您可以使用與您最初想到的類似的東西。


AtomicBoolean flag = new AtomicBoolean();


methodA() {

    ...

    if (flag.compareAndSet(false, true)) {

        // execute in another thread / executor

        new Thread(() -> {

            try {

                doSomething();

            } finally {

                // unlock within the executing thread

                // calling thread can continue immediately

                flag.set(false);

            }

        }).start();

    }

    ...

}


查看完整回答
反對 回復(fù) 2023-02-16
?
慕容3067478

TA貢獻(xiàn)1773條經(jīng)驗(yàn) 獲得超3個(gè)贊

我認(rèn)為您可以使用 ReentrantLock 及其tryLock方法。從文檔ReentrantLock::tryLock

僅當(dāng)調(diào)用時(shí)鎖未被另一個(gè)線程持有時(shí)才獲取鎖。

如果當(dāng)前線程已經(jīng)持有此鎖,則持有計(jì)數(shù)遞增 1,并且該方法返回 true。

如果鎖被另一個(gè)線程持有,則此方法將立即返回值 false。

所以你可以在你的服務(wù)中創(chuàng)建這樣的鎖作為一個(gè)字段,這樣調(diào)用你的線程methodA將共享它然后:

public class MyService {

    private ReentrantLock reentrantLock = new ReentrantLock();


    public void methodA() {

        if(reentrantLock.tryLock()) {

            doSomething();

            reentrantLock.unlock();

        }

    }

}

編輯:這里的鎖將通過調(diào)用 Thread 來持有,這個(gè)線程將等待提交的任務(wù)完成然后解鎖鎖:


public class MyService {

    private ReentrantLock reentrantLock = new ReentrantLock();

    

    private ExecutorService pool = Executors.newCachedThreadPool();

    

    public void methodA() {

        if(reentrantLock.tryLock()) {

            Future<?> submit = pool.submit(() -> doSomething()); // you can submit your invalidateCacheRunnableTask runnable here.

            try {

                submit.get();

            } catch (InterruptedException | ExecutionException e) {

                e.printStackTrace();

            } finally {

                reentrantLock.unlock();

            }

        }

    }

}

還要記住,我在這個(gè)例子中使用了 threadPool,所以這個(gè)池需要適當(dāng)?shù)仃P(guān)閉


查看完整回答
反對 回復(fù) 2023-02-16
?
不負(fù)相思意

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超10個(gè)贊

我建議您使用阻塞隊(duì)列,而不是使用某種顯式鎖。我看到的優(yōu)點(diǎn)是,如果/當(dāng)需要時(shí),您不需要重復(fù)生成線程。您只需要生成一個(gè)線程一次,該線程將只處理所有doSomething。


設(shè)想:


調(diào)用methodA時(shí),它會將專用線程的必要信息放入 BlockingQueue 并繼續(xù)運(yùn)行。專用線程將從BlockingQueue 中輪詢信息(在空隊(duì)列上阻塞)。當(dāng)隊(duì)列中收到一些信息時(shí),它會運(yùn)行您的doSomething方法。


BlockingQueue<Info> queue;


methodA() {

    //...

    queue.add(info);

    // non-blocking, keeps going    

}



void dedicatedThread(){

    for(;;) {

        //Blocks until some work is put in the queue

        Info info = queue.poll(); 

        doSomething(info);

    }


}

注意:我假設(shè)類型Info包含方法doSomething的必要信息。但是,如果您不需要共享任何信息,我建議您改用信號量。在這種情況下,方法 A 會將票放入信號量中,專用線程將嘗試?yán)L制票,阻塞直到收到一些票。


查看完整回答
反對 回復(fù) 2023-02-16
  • 3 回答
  • 0 關(guān)注
  • 171 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號