2009-08-05 10 views
1

をブロックし、まだありませんBlockingQueueの有界:、サイズによって制限され、私はJavaのBlockingQueueのが実装されているかどうかに興味があるAは、この質問のタイトルは、この存在している場合、私は疑問になり

を、ブロックされることはありませんが、あまりにも多くの要素をエンキューしようとすると例外がスローされます。

編集 - 私はBlockingQueueをExecutorに渡していますが、これはoffer()メソッドではなくadd()メソッドを使用しています。別のBlockingQueueをラップするBlockingQueueを作成し、add()の呼び出しをoffer()に委譲できます。

答えて

4

編集:あなたの新しい記述に基づいて、間違った質問をしていると思います。エグゼキュータを使用している場合は、おそらくキューを変更するのではなく、カスタムRejectedExecutionHandlerを定義する必要があります。これは、ThreadPoolExecutorを使用している場合にのみ機能しますが、そうでない場合は、キューではなくExecutorを変更する方が良いでしょう。

オファーをオーバーライドしてaddのように振る舞うのは間違いだと私の意見です。インタフェースメソッドは契約を構成します。ブロッキングキューを使用するクライアントコードは、ドキュメントで指定されているものを実際に実行するメソッドによって異なります。そのルールを破ることは、傷つく世界のために開きます。それ、そしてそれは不愉快です。


BlockingQueues上add()方法はそれを行うが、彼らはまた、一般的により良い選択であるoffer()方法を持っています。提供()のドキュメントから:

挿入、真の成功時に と、この場合はfalseを返し、 キューの容量を超えずにすぐする 可能である場合は、このキューの 末尾に指定された要素キュー がいっぱいです。このメソッドは、通常、メソッドadd(E)よりも好ましくは です。 は、例外をスローすることによって要素を挿入することができません。

これは関係なく、特定の実装(LinkedBlockingQueueなどArrayBlockingQueue、)のようなすべてのキューのために働く

BlockingQueue<String> q = new LinkedBlockingQueue<String>(2); 
System.out.println(q.offer("foo")); // true 
System.out.println(q.offer("bar")); // true 
System.out.println(q.offer("baz")); // false 
0

一つは は、別のBlockingQueueをラップし デリゲートが(追加するために呼び出すことのBlockingQueueを書くことができます)を提供する()。

答えが「はい」ですが、add()をオーバーライドするサブクラスを作成すると、よりうまくやり遂げることができます。 (どちらの場合も)唯一のキャッチは、あなたのバージョンaddがオーバーライドしているメソッドにないチェック例外を投げることができないため、「ブロックする」例外をチェックする必要があります。

+0

それに問題があなたのサブクラスのadd()メソッドは、現在、基本クラスのadd()に異なった動作をすることをある:

おっとより、私の残りのコメントを参照してください。 – PaulJWilliams

+1

@Visage:うん、そうだけど、ときどき、うまくいくには良いデザイン原則に違反しなければならない。この場合、私は、この「非標準」クラスが非常に狭い文脈で使用されていることを作者が確かめることを期待しています(そして期待します)。確かに公開APIで公開するのは悪い考えです。 –

0

これは悲しいことです。ブロックすることはできません。ブロックしたいユースケースがたくさんあります。エグゼキュータに独自の制限付きブロッキングキューを提供することは意味がありません。

public void execute(Runnable command) { 
     if (command == null) 
      throw new NullPointerException(); 
     if (poolSize >= corePoolSize || !addIfUnderCorePoolSize(command)) { 
      if (runState == RUNNING && workQueue.***offer***(command)) { 
       if (runState != RUNNING || poolSize == 0) 
        ensureQueuedTaskHandled(command); 
      } 
      else if (!addIfUnderMaximumPoolSize(command)) 
       reject(command); // is shutdown or saturated 
     } 
    } 
0

クエリはバッチでソースDBから実行を取得するための簡単な使用ケース(エグゼ)、バッチで豊かにし、別のデシベル(エグゼ)に入れて、あなただけのように速く、彼らが置かれているとして、クエリを実行したいと思います別のデータベースに入れます。この場合、dest executorは、ポーリングを保持してより多くの照会を実行するために完了した数をチェックするよりも、問題を解決するためにブロックされたexecutorを受け入れる必要があります。 - これ置換原則に違反

関連する問題