0

今、私はサーバーに送信するリクエストオブジェクトを処理するための最良の方法を決定することに夢中になっています。つまり、アプリ内にインプレッションやクリックの追跡などの追跡要求オブジェクトがあります。ペイロードが非常に少ない単純なリクエスト。私のアプリには、追跡する必要のあるオブジェクトが同時に隣り合って表示される場所があります(追跡する必要がある同時オブジェクトは最大で3つ)。たとえば、オブジェクトが表示されるたびに、追跡リクエストを作成する必要があります。それらのそれぞれのオブジェクト。

これらのオブジェクトをベクターに追加するシングルトンキュースレッドを簡単に作成できることはすでにわかっています。スレッドはそれらをメインループで処理するか、処理するオブジェクトができるまでキューで待機します。これは明確な解決策のように聞こえますが、キューは数十に蓄積される可能性があり、リクエストごとに1つの接続を確立するため、同時に実行されないため、面倒な場合があります。

私が念頭に置いていたのは、セマフォを介して2つの同時接続を作成し、追跡イベント要求を含むスレッドオブジェクトを処理できるスレッドプールを作成することでした。つまり、新しいスレッドオブジェクトを作成し、それをVectorに追加する関数を作成したかったのです。この関数では、スレッドプールがスレッドのセットを反復処理し、一度に2つ処理します。次のようなオブジェクトを追加する関数を作成できることはわかっています。

public boolean addThread(Runnable r){
synchronized(_queue){
    while(!dead){
       _queue.addElement(r);
       //TODO: How would I notify my thread pool object to iterate through the list to process the queue? Do I call notify on the queue object, but that would only work on a thread right??
       return true
    }
    return false;
}

私が疑問に思っているのは、スレッド自体がどのように実行されるのかということです。リストにスレッドを追加した後にスレッドプールを実行する関数を作成するにはどうすればよいですか?また、セマフォは2回目の接続後にブロックされるため、空きスロットができるまでアプリがロックされますか、それともリストをループしているときにスレッドプールオブジェクトにロックされますか?

いつものように、私はJ2ME / Blackberry環境を対象としているため、1.5より前の回答のみが受け入れられ、GenericsやConcurrentパッケージのクラスは受け入れられません。

編集:だから私はこれが多かれ少なかれそれがどのように見えるべきかであると思います:

class MyThreadPool extends Thread{

  private final Vector _queue = new Vector();
  private CappedSemaphore _sem;
  public MyWaitingThread (){
      _sem = new CappedSemaphore(2);
      this.start();
  }
  public void run(){
     while(!dead){
        Runnable r = null;
        synchronized(_queue){
          if(_queue.isEmpty()){
            _queue.wait();
          } else {
            r = _queue.elementAt(0);
            _queue.removeElement(0);
          }
       }
       if(r != null){
          _sem.take();
          r.run();
          _sem.release();
       }
    }
 }
 public boolean addThread(Runnable r){
   synchronized(_queue){
   if(!dead){
     _queue.addElement(r);
     _queue.notifyAll();
     return true
   }
   return false;
 }
}
4

1 に答える 1

-1

やりたいことは、スレッド側で各スレッドをキューで待機させることです。例えば

class MyWaitingThread extends Thread{

   private final Queue _queue;
   public MyWaitingThread (Queue _queue){
      this._queue = _queue;
   }
   public void run(){
      while(true){
       Runnable r = null;
       synchronized(_queue){
            if(_queue.isEmpty())
                _queue.wait();
            else
               r = queue.pop();
        }
      if(r != null) r.run();
      }
   }
}

そして、他のロジックでは次のようになります。

public void addThread(Runnable r){
     if(!dead){
       synchronized(_queue){
         _queue.addElement(r);
         _queue.notifyAll();
       }
     }
}

これ_queue.notifyAllにより、インスタンスで待機しているすべてのスレッドが起動し_queueます。while(!dead)また、同期ブロックの外側を移動し、 に変更したことに注意してif(!dead)ください。元の状態のままにしておくと、期待どおりに機能しないことは想像できます。

于 2011-04-11T23:26:34.250 に答える