2

Javaで次のようなことができますか:

 protected Runnable getRunnable(final int seconds) {
    Runnable runnable = new Runnable() {
        public void run() {
                sendData();             
                try {
                    Thread.sleep(seconds * 1000);
                } 
                catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
        }
    };
    return runnable;
}

その後:

protected void startTimer(int seconds) throws InterruptedException,NullPointerException {
    Thread thread = new Thread(getRunnable(seconds));
    thread.start();
}

前述のプロセスは安全ですか??

4

3 に答える 3

3

はい、安全です(sendDataそれ自体が安全であると仮定します)が、あなたが何を期待しているのか正確にはわかりません。書かれたコードは、すぐに を呼び出す新しいスレッドを作成し、戻りsendData()sendData、スレッドは数秒間スリープし、他に何もせずに終了します (したがって、スリープは、JVM の終了またはRunnableまたは含まれているオブジェクトは、スリープが終了するまでガベージ コレクションされません)。呼び出すに待機させたい場合sendDataは、少し交換する必要があります。

于 2013-01-08T13:02:38.163 に答える
3

あなたが言うコメントで

私がやろうとしているのは、特定の秒数ごとに(つまり、15秒ごとに)sendData()メソッドを実行することだけです

次に、それを整理する組み込みのタイマーを使用します。次に例を示します。

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Runnable r = new Runnable() {
    @Override
    public void run() {
        sendData();
    }
};
ScheduledFuture<?> future = scheduler.scheduleAtFixedRate(r, 0, 15, TimeUnit.SECONDS);

//when you want to cancel the scheduled task
future.cancel(true);

//and before you leave your program, don't forget to call:
scheduler.shutdown();
于 2013-01-08T13:36:16.733 に答える
2

試してみましたか?答えは、それが機能するということです。Runnable(上記の例では匿名クラス)によって実装されたインターフェースObjectであり、他のオブジェクトと同じようにそれを渡したり参照したりできます。

上記は内部クラスであるため、外部 (周囲の) クラスへの暗黙的な参照があることに注意してください。

于 2013-01-08T12:57:50.773 に答える