0

ScheduledThreadPoolExecutor の仕組みを理解するのに少し問題があります (SCA を使用しているので、コード内の注釈は気にしないでください)。これは、Scheduler クラスのコードの一部です。

@AllowsPassByReference
public ScheduledFuture<?> schedule(Task task)
{
    future=scheduler.scheduleAtFixedRate(task.getRunnableContent(), task.getDelay(), task.getPeriod(), TimeUnit.MILLISECONDS);
    return future;
}

@AllowsPassByReference
public void deschedule(Task task)
{
    scheduler.remove(task.getRunnableContent());
}

これは Task クラスのコードの一部です。

public void scheduleTask()
{
    if(!running)
    {
        future=scheduler.schedule(this);
        running=true;
    }
}

public void descheduleTask()
{
    if(running)
    {
        future.cancel(mayInterruptIfRunning);
        scheduler.deschedule(this);
        running=false;
    }
}

ここからが大当たり!どこを見ても、ScheduledFutures でキャンセルを使用し、スケジューラでシャットダウン メソッドを使用していましたが、スケジューラを停止したくありませんでした。もう少し詳しく説明しましょう。このアプリケーションでは、定期的なタスクをいつでも個別にスケジュール、停止、および再スケジュールする必要があるため、スケジューラ サービス全体をシャットダウンせずに実行を開始した単一のタスクを中断する方法が必要です。私がやろうとしていることを理解していただければ幸いです。何かアドバイスはありますか?ありがとう :)

4

1 に答える 1

0

定期的なタスクをキャンセルすると、このタスクの後続のスケジューリングはキャンセルされますが、スケジューラ自体は実行され、別のタスクのスケジューリングに使用できます。

タスクの実行中に Future.cancel を呼び出すと、

a) Future.cancel(false) は実行中のタスクには影響しません

b) Future.cancel(true) は、タスクのスレッドで Threed.interrupt を呼び出しますが、実行中のタスクが停止するかどうかは、タスクの実装によって異なります。たとえば、タスクは InterruptedException (存在する場合) をキャッチし、作業を続行できます。

于 2013-03-13T02:47:41.430 に答える