これは、質問が次のようになると私が想像する方法です。
Q: GUI イベント スレッドにコールバックがあり、250 ミリ秒ごとに同じスレッドでアクションをトリガーする必要があります。GUI がフリーズするため、この時間は GUI スレッド ブロックを使用できません。私に何ができる?
A: エグゼキューターを使用して、GUI イベント スレッドで定期的にタスクをトリガーします。
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// task to be perform periodically in the GUI Event Thread.
}
});
}
}, 250, 250, TimeUnit.MILLISECONDS);
タスクを実行する GUI スレッドと待機を行うバックグラウンド スレッド。
私はもっと似たようなものを書くでしょう
long time = 0;
while(condition) {
long now = System.nanoTime();
if (now >= time + 200e6) {
// do something
time = now;
}
// do something else
}
プログラムの特定の要件を知らなくても、コードを読むことができます。
long time = 0; // a local variable or field as appropriate
// you have a loop around all code of interest at some level
// You could have a GUI event loop which you don't define but it is there.
// at some point your checking code is called.
long now = System.nanoTime();
if (now >= time + 200e6) {
// do something
time = now;
}
何もブロックしたくないので、これはそのまま待機しません。代わりに、コード ブロックが 200 ミリ秒以内に呼び出されるのを防ぎます。
int i = 0, count = 0;
long start = System.nanoTime();
long time = 0;
while (count < 20) {
long now = System.nanoTime();
if (now >= time + 200e6) {
// do something e.g.
count++;
time = now;
}
// do something else
}
long runTime = System.nanoTime() - start;
System.out.printf("Performed something at %.3f per second%n", (count - 1) * 1e9 / runTime);
版画
Performed something at 5.000 per second