開発中のアンドロイドアプリでは、いくつかの繰り返しタスクを処理するために余分なスレッドを作成する必要があります。私はただ1つのスレッドしか必要とせず、タスクは非常にシンプルですが頻繁に、間欠的で、順番にする必要がありますnewSingleThreadExecutorとwait()とnotify()を使用した新しいスレッド()
私はExecutors.newSingleThreadExecutorがこのような状況に適していると考えました。しかし、私は本当に新しいスレッドを作成する上でこれを使用する利点を得ることはありません。
Executors.newSingleThreadExecutorを使用してsubmit()関数を使用してタスクをキューイングする代わりに、専用のスレッドを作成するのは悪いですか?私はそれがタスクのキューを通過するようにし、キューが空のときに待機し()、メインスレッドが新しいタスクを送信すると、ワーカースレッドに通知します。これは悪い習慣ですか?
// loop for worker thread
public class WorkerThrd extends Thread {
public void run() {
while(true){
while (!queue.empty()) {
queue.getTask().doSth();
}
synchronized(this){
try {
wait();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
// from main thread
private WorkerThread wthread;
public void initiation(){
wthread = new WorkerThread();
wthread.start();
}
public void postSth(){
wthread.queue.post(new task()); // a thread safety queue
synchronized(wthread){
if(wthread.getState() == Thread.State.WAITING) {
wthread.notify();
}
}
}
P.S.待ち行列がスレッドセーフであると仮定していましたが、wait()またはnotify()を呼び出すたびに同期ブロックが必要ですか? 1つのスレッドだけがwait()を呼び出し、他の1つのスレッドがnotify()を呼び出す場合でも、
状態を確認したときにスレッドが待機していない場合はどうなりますか?どのようにこれまでに通知されますか? –
ホイールを改造することは**悪い習慣です、はい。また、あなたの実装は 'doSth()'でスローされた例外を処理しません... – Fildor
@Andy Turnerそれがループになるので、待機していないときに通知する必要はありません。 –