如果我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;
}
}
如您所见,如果我为同一个实例并发执行多个线程MyRunnable
(如前所示),对 的任何更改都mode
可能以不同的方式影响并发运行的线程。例如,如果一个线程将 设置mode
为STOPPED
,则另一个线程可能会mode
在每个其他线程看到它被设置为 之前将其更改为其他值STOPPED
。这可以很容易地阻止线程退出 while 循环。
那么我如何设计一个Runnable
“同时可用”的?甚至可能吗?不值得吗?我可以使用C# 的ThreadStatic属性(我认为在这种情况下会很完美)吗?