を実装するクラスがある場合、技術的には、複数のスレッドが同じインスタンスで同時にjava.lang.Runnable
呼び出すのを止めるものはありません。例:run
Runnable
Runnable r = new MyRunnable();
//start thread 1
new Thread(r).start();
//start thread 2
new Thread(r).start();
run
メソッドが完全に「自己完結型」(つまり、プライベート インスタンス メンバーに依存しない)の場合、これは実際には問題になりません。スレッド間で共有される変数Runnable
がないため、「破損した」内部状態になることは決してないからです。しかし、ほとんどの場合、で操作するプライベート インスタンス メンバーRunnable
がいくつかあるrun
と思います。
例を使用すると、私のMyRunnable
クラスにはプライベートmode
フィールドがあります。run
主な目的は、 ( に設定mode
することによって) メソッドを完全に停止することですSTOPPED
が、他の用途もあります。
public static class MyRunnable implements Runnable
{
enum Mode { RUNNING, PAUSED, STOPPED, FASTFORWARDING, REWINDING; }
private volatile Mode mode;
@Override
public void run()
{
mode = Mode.RUNNING;
while (mode != Mode.STOPPED)
{
//do stuff. possibly other changes to the mode.
}
}
public void setMode(Mode mode)
{
this.mode = mode;
}
public Mode getMode()
{
return mode;
}
}
ご覧のとおり、 (前に示したように)の同じインスタンスに対して複数のスレッドを同時に実行すると、 への変更は、同時に実行されているスレッドにさまざまな方法で影響を与える可能性があります。たとえば、あるスレッドが を に設定すると、他のすべてのスレッドが に設定されたことを確認する前に、別のスレッドが を別のものに変更する可能性があります。これにより、スレッドが while ループを終了するのを簡単に防ぐことができます。MyRunnable
mode
mode
STOPPED
mode
STOPPED
Runnable
では、 「同時に使用できる」ように設計するにはどうすればよいでしょうか。それは可能ですか?それだけの価値はありませんか?私が使用できるC#のThreadStatic属性のようなものはありますか(このコンテキストでは完璧だと思います)?