2012-04-27 4 views
-1

から最初の5つの要素、私は私のmultithreaded ENVでVectorを持っていると私はthreadpoolベクトル

に渡すために、その最初の5つの要素を取得する必要がありますを取得します。これを回避するためのベストプラクティスはありますか? (java utilクラスを使用していることを意味します)

​​ブロック内で実行でき、最初の5つの要素が見つかるまでループします。私はそれを行う正しい方法であると思っています。

お願いします。

UPDATED SECTION ------

私は解決する必要が私の実際の問題を見つけてください。

  1. クラスAは、ベクターがあります

  2. クラスBが延びるmyOwnThreadPoolを有することになる(優先順位に従ってソートする。これはheigh頻度で更新されます。私は、最初の5つの要素を取得する必要があります) java.util.ThreadPoolExecutorとそれをオーバーライドするメソッドafterExecute (プールサイズは5になります)

  3. クラスAは、ベクトルから最初の5つの要素を取得し、クラスBプールに送信して処理します。

  4. afterExecute方法は、一つのスレッドが、私は(最も優先度クラスA/IN)vectorから最初の最も要素を選択し、処理するためにプールに送信し返されていることを通知されると。

私の質問は、皆さんにとってより良いアイデアを与えると思います。

ご回答ありがとうございました。ガイダンスやその他のご提案は大歓迎です。

List five = myVector.subList(0, 5); 

これは、要素のコピーは、ベクターのみへのビューを構築することはありません。

+0

それはまだ修正されてますか?サイズが5を下回るかもしれませんか? –

+0

'Vector'はスレッドセーフです..あなたの懸念事項は何ですか? –

+0

@LouisWasserman - それは5またはいくつかの設定可能な整数になります。 – Sam

答えて

6

Vectorは、次のように使用することができますsubList方法を、提供しています。

List five = new List(); 
Collections.copy(five, myVector.subList(0, 5)); 
+0

これを指摘してくれてありがとう。それは私にとっては新しいことです。 – Sam

1

ベクターを使用しないでください。同期リストを作成するには、Collections.synchronizedList()を使用することを検討してください。

http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#synchronizedList%28java.util.List%29

List list = Collections.synchronizedList(new ArrayList()); 
     ... 
    synchronized(list) { 
     Iterator i = list.iterator(); // Must be in synchronized block 
     while (i.hasNext()) 
      foo(i.next()); 
    } 
+0

@ Garbadge - 答えてくれてありがとう。私はちょうどこの 'synchronizedList'について知る必要があります。 – Sam