2016-10-10 6 views
0

イベントループスレッドとしてスレッドを使用したいと思います。私は、 "QThreadのような振る舞い"(以下の例ではt2)のJavaスレッドを意味します。説明:イベントループスレッドとしてのJavaスレッド

私はスレッドt1(メインスレッド)とスレッドt2(ワーカースレッド)を持っています。 は、t1から呼び出され、t2スレッドで実行されます。

現在、私は(それが動作しますが、私はそれを好きではない)、このコードを作った:

- スレッドT1(例えばメインスレッド、UIスレッド):

//... 
// Here, I want to call "method()" in t2's thread 
Runnable event = new Runnable() { 

    @Override 
    public void run() 
    { 
     t2.method(param); 
    } 
}; 
t2.postEvent(event); 
//... 

を - スレッドT2

//... 
Queue<Runnable> eventLoopQueue = new ConcurrentLinkedQueue<Runnable>(); 
//... 
@Override 
public void run() 
{ 
    //... 
    Runnable currentEvent = null; 
    while (!bMustStop) { 
     while ((currentEvent = eventLoopQueue.poll()) != null) { 
      currentEvent.run(); 
     } 
    } 
    //... 
} 

public void method(Param param) 
{ 
    /* code that should be executed in t2's thread */ 
} 

public void postEvent(Runnable event) 
{ 
    eventLoopQueue.offer(event); 
} 

このソリューションは醜いです。私はt2の "always-working"メインループが好きではなく、のたびに新しいRunnableが割り振られています...私のプログラムはmethodのように40回/秒のようなものを呼び出すことができます。私は、Android上で使用されるべき解決策を探しています

はあまりにも(私は、AndroidのためのクラスLooperを知っているが、それは、唯一のAndroidのためのとても不可能だ)

答えて

2

BlockingQueueの使用を検討して代わりにその方法take()ためQueue要素がキュー上で利用可能になるまでスレッドをブロックし、poll()のようなサイクルを無駄にしません。

0

(同期/待機/通知を使用して)新しい偶数が送信されるまで待機することもできます。しかし、前の答えで言及したように、BlockingQueueは仕事をすることができます。スレッドを終了する予定があるときは、どちらの場合も中断することを忘れないでください。

0

Java 1.5以降、優れたソリューションがスレッドプール用に用意されています。実行のためにタスクを送信できるスレッドプールがあります。プールはスレッドを取り、あなたのタスクを実行します。タスクが実行されると、スレッドは透過的にプールに戻ります。 ExecutorServiceインターフェースとそのすべての実装を見てください。また、Executorsヘルパークラスを見てください。これは、あなたが必要とするものすべてを提供するはずです

関連する問題