基本的に、私には次のような一連のシーケンスサブタスクで構成される長いタスクがあります。
class Task implements Runnable
{
private Foo foo;
public Task(Foo foo)
{
this.foo = foo;
}
@Override
public void run()
{
doTask1(foo);
doTask2(foo);
doTask3(foo);
doTask4(foo);
// ...
doTaskN(foo);
}
}
必要なのは、の1つのインスタンスのみを実行することです。Task
一方Task
が開始された場合、もう一方Task
のインスタンス(存在する場合)はすぐに終了する必要があります。
シングルスレッドエグゼキュータを使用しました:
Executor executor = Executors.newSingleThreadExecutor();
そして私は次のようにタスクを実行します:
executor.execute(new Task(foo));
これにより、一度に1つのタスクのみが実行されることが保証されますが、残念ながら、前のタスクは終了しません。
ただし、次のように、2つのサブタスクの間にブールフラグを使用することにしました。
class BooleanHolder
{
boolean terminate = false;
}
class Task implements Runnable
{
private Foo foo;
private BooleanHolder bh;
public Task(Foo foo, BooleanHolder bh)
{
this.foo = foo;
this.bh = bh;
}
@Override
public void run()
{
bh.terminate = false;
doTask1(foo);
if(bh.terminate) return;
doTask2(foo);
if(bh.terminate) return;
doTask3(foo);
if(bh.terminate) return;
doTask4(foo);
// ...
if(bh.terminate) return;
doTaskN(foo);
}
}
次のように使用します。
BooleanHolder bh = new BooleanHolder();
// ...
bh.terminate = true;
executor.execute(new Task(foo, bh));
ただし、これは非効率的なソリューションであり、スレッドセーフではないようです。より良い解決策を提案しますか?