4

私は ScheduledExecutorService を使用しており、1 分間 10 秒ごとに何らかの計算を行い、その分後に新しい値を返すようにしたいのですが、どうすればよいですか?

例: 5 を受け取り、+1 を 6 回追加すると、1 分後に 11 の値が返されます。

私がこれまでに持っているが機能していないのは次のとおりです。

package com.example.TaxiCabs;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import static java.util.concurrent.TimeUnit.*;


public class WorkingWithTimeActivity {
public int myNr;
public WorkingWithTimeActivity(int nr){
    myNr = nr;
}
private final ScheduledExecutorService scheduler =
        Executors.newScheduledThreadPool(1);

public int doMathForAMinute() {
    final Runnable math = new Runnable() {
        public void run() {
            myNr++;
        }
    };
    final ScheduledFuture<?> mathHandle =
            scheduler.scheduleAtFixedRate(math, 10, 10, SECONDS);
    scheduler.schedule(
            new Runnable() {
                public void run() {
                    mathHandle.cancel(true);
                }
            }, 60, SECONDS);
    return myNr;
}

}

そして私の主な活動では、1分後にtxtviewテキストを11に変更したいです。

WorkingWithTimeActivity test = new WorkingWithTimeActivity(5);
txtview.setText(String.valueOf(test.doMathForAMinute()));
4

2 に答える 2

7

CallableRunnableではなくvalueを返すことができるwhichを使用する必要があります

Callableインターフェースは、インスタンスが別のスレッドによって実行される可能性のあるクラス用に設計されているという点でRunnableに似ています。ただし、Runnableは結果を返さず、チェックされた例外をスローすることはできません。

public class ScheduledPrinter implements Callable<String> {
    public String call() throws Exception {
        return "somethhing";
    }
}

次に、以下のように使用します

    ScheduledExecutorService scheduler = Executors
            .newScheduledThreadPool(1);
    ScheduledFuture<String> future = scheduler.schedule(
            new ScheduledPrinter(), 10, TimeUnit.SECONDS);
    System.out.println(future.get());

これはワンショットスケジュールであるため、get呼び出しが返された後、再度スケジュールする必要があるのは1回だけ実行されます。


ただし、あなたの場合は、単純なものを使用して、条件が到着したら、cancelを呼び出してスケジューリングをキャンセルすると、戻り値を比較するのが簡単にAtomicIntegerなります。addAndGet

于 2012-11-01T17:22:23.183 に答える
0

から結果を返したい場合はdoMathForAMinute、ScheduledExecutorService はまったく必要ありません。計算を実行してから Thread.sleep() を実行するループを作成するだけです。ScheduledExecutorService を使用する全体的な考え方は、タスクを開始するスレッドを結果の待機から解放することですが、ここではスレッドを解放しません。

私が推測するように、呼び出すスレッドdoMathForAMinuteが GUI スレッドである場合、GUI がスタックして 1 分間応答しないため、完全に間違っています。代わりに、doMathForAMinute並列計算のみを開始し、並列タスク自体が UI を更新する必要がありますrunOnUiThreadまたは他の方法を使用します。

以下も参照してください。

Android: runOnUiThread は常に正しいスレッドを選択するとは限りませんか?

ScheduledThreadPoolExecutor、TimerTask、または Handler はどこで作成して使用できますか?

于 2012-11-01T17:41:32.517 に答える