私は定期的にコードを実行するスレッドを持っています。 g。 10秒ごとに私は同じコードを自発的に呼び出し、10秒間待たなくてもいいという選択肢を持っていたいと思います。しかし、自動的かつ自発的な実行のコードは同時に実行してはいけません。代わりに、スレッドが同じメソッドを呼び出している間にユーザーが実行ボタンを押した場合は、順番に実行する必要があります。定期的に実行されているスレッドのコードの自発的実行
誰もがこのような要件に対応できる良いパターンやクラスを知っていますか?
最初に気になるのは、作業方法を同期させることです。しかしその場合、手動実行(例えば、ボタン押下)はブロックされ、スレッド内のメソッドが終了するまで待たなければならない。ブロックせずにより良いアプローチがありますか?
例:
public class Executor extends Thread {
// endless loop, executes work method periodically with pause inbetween
@Override
public void run() {
while(true) {
work("automatic");
pause(10000);
}
}
// Working method that's executed periodically or manually
private synchronized void work(String text) {
System.out.println("Working " + text + " " + System.currentTimeMillis());
}
// helper method that pauses the thread
private static void pause(long sleepMs) {
try {
Thread.sleep(sleepMs);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// start automatic execution
Executor executor = new Executor();
executor.start();
// pause a while
pause(1000);
// manual execution
executor.work("manual");
}
}
編集:私の要件にソリューション:
public class ScheduledExecutor {
public static void main(String[] args) throws InterruptedException {
ScheduledThreadPoolExecutor executor = (ScheduledThreadPoolExecutor) Executors.newScheduledThreadPool(1);
executor.scheduleWithFixedDelay(new Work("auto"), 0, 10, TimeUnit.SECONDS);
Thread.sleep(1000);
executor.execute(new Work("manual"));
}
public static class Work implements Runnable {
String text;
public Work(String text) {
this.text = text;
}
@Override
public void run() {
System.out.println("Working " + text + " " + System.currentTimeMillis());
}
}
}
睡眠を中断しますか? –
スレッドがスリープモードになっていないときにスレッドが中断した場合はどうなりますか? – Roland
質問を更新して、どのように機能させるかを明確にすることはできますか?あなたは、手動と自動のスレッドコードを同時に実行したくないと言っています。次に、ボタンを押したときに手動での実行をブロックしたくないと言います... – Allan