2016-10-24 9 views
0

次のアプローチを実装している既存のフレームワークはありますか?Java待機可能オブジェクトコンテナ

public class WaitableContainer<T> { 
    private T object; 
    public <T> peekAwait() {...} // returns object if object !=null or makes the caller thread sleep until object != null 
    public actuate(T object) { 
    this.object = object; // here all sleeping threads must awake and receive the new object 
    } 
} 

他のスレッドがオブジェクトを設定するまで、発信者スレッドをalsepにするオブジェクトラッパーを必要とします。

+1

私はBlockingQueueインターフェイスが(少なくとも最初の方法で)役立つかもしれないと思います。私は実際にehwatを取得する必要がありますアクチュアートは行うべきである – pandaadb

+0

また、あなたはjavaを試すことができます未来 – ka4eli

+0

'CyclicBarrier'の仕事のように見える – talex

答えて

1

CompletableFutureのように聞こえます。

// container.actuate(o); becomes 
future.complete(o); 

// container.peekAwait(); becomes 
future.get(); 

は、Java 8、FutureTaskは、この問題を回避するためのまともな選択をするのではなく、明示的に設定するよりも、あなたが設定したい値を返す、Callableを提供を使用できない場合。

final FutureTask<Object> lazyLoadedData = new FutureTask<>(() -> expensiveIO()); 

... 

if (!lazyLoadedData.isDone()) { 
    synchronized(lazyLoadedData) { 
     if (!lazyLoadedData.isDone()) { 
      // run() does the computation and sets the data 
      // essentially, lazyLoadedData.set(expensiveIO()) 
      lazyLoadedData.run(); 
     } 
    } 
} 
// Data is available 
lazyLoadedData.get(); 

ExecutorServiceのは、これを行うた上で、あなた計画、それはすでに未来を返した場合、

final FutureTask<Object> future = executorService.submit(() -> expensiveIO()); 

// Now you just need to call get() 
future.get(); 
関連する問題