【发布时间】:2012-05-22 15:09:30
【问题描述】:
如果我有一个实现java.lang.Runnable 的类,从技术上讲,没有什么可以阻止多个线程在Runnable 的相同 实例上同时调用run。示例:
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 属性(我认为在这种情况下会很完美)吗?
【问题讨论】:
标签: java multithreading concurrency software-design runnable