2

に送信されたタスクのリストがありExecutorServiceます。ただし、タスクが完了していなくても、午前2時30分の期限までにExecutorServiceをシャットダウンする必要があります。どうすればこれを達成できますか?APIを確認しましたが、以下のようなメソッドしかありません。

ExecutorService exec = //...    
exec.awaitTermination(100, TimeUnit.MILLISECONDS);

しかし、どうすれば次のブロックをアトミックに実行させることができますか?つまり、どうすればギャップを回避できますか?例えば:

long timeDiff= calculate(now, deadline);
// Gap: assuming current thread does not have chance to run for 10 minutes...
exec.awaitTermination(timeDiff, TimeUnit.MILLISECONDS);

ありがとう。

4

2 に答える 2

2

あなたはおそらく「原子的に」を意味するのではなく、ここでは「遅滞なく」を意味すると思います。したがって、をtimeDiff呼び出すときはそれでも正しいexec.awaitTermination()です。

私はそれが正しいと思います、それで答えは:あなたはできません

詳細に興味がある場合:JavaコードはJavaバイトコードに変換され、これらはオペレーティングシステムで実行されている通常のプロセスであるJVMによって実行されます。また、オペレーティングシステムがスレッドに割り込むのを止めることはできません(プリエンプティブマルチタスクを備えたオペレーティングシステムを使用していると思います(すべてのUNIX(LinuxおよびMac OS Xを含む)、Windows 95以降など))。

1つのJavaバイトコードですべてを実行できたとしても、オペレーティングシステムが1つのJavaバイトコードの途中で割り込む可能性があるため、期待どおりに機能しません。

そして、awaitTermination(Date deadline)方法でさえここでは役に立ちません。それも誰かが実装する必要があります。

あなたができる最善のことは、できるだけ少ないバイトコードでそれを行うことです。

もし私があなたなら、おそらくあなたのコードと同じようにやります。

ただし、それはもう少し正確かもしれません:

Date deadline = ....;

final TimerTask stopTask = new TimerTask() {
    public void run() {
        exec.shutdownNow();
    }
};

new Timer().schedule(stopTask, deadline);

shotdownNow()しかし、私が言ったように:ですぐに実行される本当の保証はありませんdeadline。実際には、実際の締め切りの1秒前に設定deadlineしても問題ありません:-)

于 2011-08-23T18:16:54.307 に答える
1

別の優先度の高いスレッド(またはタイマー)で期限を待ち、exec.shutdownNow()

于 2011-08-23T17:46:32.770 に答える