如果我有一個實現了java.lang.Runnable
的類,在技術上沒有任何東西阻止多個線程同時調用run
在相同的實例Runnable
。例如: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;
}
}
正如你可以看到,如果我同時執行多個線程的MyRunnable
的相同情況下(如前所示),任何改變mode
會以不同方式影響同時運行的線程。例如,如果一個線程將mode
設置爲STOPPED
,另一個線程可能會在每個其他線程看到它被設置爲STOPPED
之前將mode
更改爲其他值。這很容易阻止線程退出while循環。
那麼我如何設計一個Runnable
爲「可同時使用」?它甚至有可能嗎?這不值得嗎?有沒有像C#的ThreadStatic屬性我可以使用(我認爲這將是完美的在這種情況下)?