複数のスレッドで一度だけメソッドを呼び出します

OLY:

私は、同時に要求の多くを提供するWebアプリケーションを持っています。methodA() - アプリのAPIのいずれかの方法で、私は方法があります。doSomethingの() - この方法では、私は別のメソッドへの呼び出しを持っています。私は別のスレッドでのdoSomething()メソッドを実行します私はmethodA(の最初の呼び出しをしたいシナリオを)持っていますが、この時点では、methodA()への別のコールが呼び出された場合、doSomethingのを(実行しないでください()メソッド)のはまだ別のスレッドで実行されているため)だけmethodA(の残りの部分を続行します。

methodA() {
 .
 .
 doSomething() // In a new thread
 .
 .
}

私はフラグとして、原子ブール値を使用して考えられてきましたが、私はそれが最高のアイデアだかはわかりません。

    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);
        } 

ありがとう!

Bubletan:

あなたは使用することができReentrantLockのをロックは、一度に1つのスレッドを許可し、そののtryLock()メソッドは、ロックが取得されたかどうかに応じて、trueまたはfalseですぐに復帰します。

ReentrantLock lock = new ReentrantLock();

methodA() {
    ...
    if (lock.tryLock()) {
        try {
            doSomething();
        } finally {
            lock.unlock();
        }
    }
    ...
}

あなたが実行したい場合はdoSomething()、別のスレッドでは、あなたが呼び出したスレッドのいずれかをブロックしたくない、あなたはちょうどあなたが最初に考えたものと同様のもので行くことができます。

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();
    }
    ...
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=228852&siteId=1