0

さまざまな数学関数を計算する Java アプリケーションを開発しています。これがシナリオです。私はM個の実行可能なタスクを持っています(それぞれがさまざまな問題を計算するためのもので、1つは二次方程式を解き、もう1つは指数関数を解くなど)。これらのM ランナブルは、N 分ごとに実行する必要があります。これらのランナブルは、必ずしも並行して実行する必要はありません。複数のスレッドを作成することは許可されていません。

タスクを定期的に実行するためにScheduledExecutorServiceを使用できます。Javadoc によると、ScheduledExecutorService で使用できるランナブルは 1 つだけです。実行可能な Collection を提供できるinvokeAll(...)のようなメソッドがありますが、これらはスケジューリング オプションを提供しません。

私が見つけたインターネットの閲覧で、Thread.sleep()を使用することは、アプリケーションを開発するための良い方法ではありません。

助言がありますか??

4

2 に答える 2

1

ExecutorServiceジョブを実行するスレッドを 1 つだけ含むものを作成できます。

ExecutorService executorService = Executors.newSingleThreadExecutor();

メソッドを使用してこのサービスに複数のジョブを送信すると、単一のインスタンスinvokeAllを使用して順次実行されます。Thread

ScheduledExecutorServiceN分ごとにジョブを実行するために使用したい場合は、に切り替えることができます

ScheduledExecutorService scheduledExecutorService = 
    Executors.newSingleThreadScheduledExecutor();

これにより、ジョブをより適切に制御するための追加の方法が提供されます。

ご覧のとおり、invokeAllメソッドは から派生しExecutorServiceているため、スケジュール オプションは提供されません。それでもこれは単なるショートカットであり、Runnable通常のループを使用して複数のインスタンスをスケジュールできます。

for (Runnable job : allJobs) {
    scheduledExecutorService.scheduleAtFixedRate(job, 0L, N, TimeUnit.MINUTES);
}
于 2014-03-04T16:46:42.227 に答える
0

次のような複数の実行可能クラスを作成する場合、そのインスタンスをスケジューラに渡すと、インスタンス化したすべての実行可能クラスが実行されます。残りはスケジューラーが行います。これは、ランナブルの配列を順番に実行するだけです。

public class MultipleRunnable implements Runnable
{
    private Runnable[] commands;
    public MultipleRunnable(Runnable[] commands)
    {
        this.commands = commands;
    }

    public void run()
    {
        for(int i = 0 ; i < commands.length ; i++)
        {
             commands[i].run();
        }
    }
}

それを開始するには、次のようなものが機能するはずです。

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(
new MultipleRunnable(new Runnable[]{run1, run2, ..., runM}),
n, n, TimeUnit.MINUTES);
于 2014-03-04T16:47:34.577 に答える