我有一个班级,例如:
public class Test {
private static Thread aThread;
private static Loopy aLoop;
public Test() {
}
public static void main(String[] args) {
startUpdate();
stopUpdate();
startUpdate();
}
public static void startUpdate() {
aLoop = new Loopy();
aThread = new Thread(aLoop);
aThread.start();
}
public static void stopUpdate() {
if (aThread != null) {
aLoop.finish();
}
}
}
使用看似如下的可运行代码:
public class Loopy implements Runnable {
private static String status = "R"; // Run
public void run() {
while (status.equals("R")) {
// Do Stuff
}
}
public void finish() {
status = "F"; // End Run
}
}
第一次调用startUpdate。
StopUpdate按计划工作。
第二次调用startUpdate导致没有工作,因为状态仍然等于停止的“F”,即使我正在启动一个新的Loopy实例(对我来说)应该具有默认值“R” ”
状态是否在实例之间持续存在,或者我发现了一个我还没有发现的错误?
答案 0 :(得分:5)
您过度使用了static
。
在Loopy
课程中,String status
为static
,因此会在所有Loopy
个实例之间共享。
您应该删除status
。
static
成为实例变量
另一个注意事项是status
也应该是volatile
,因为它的状态被许多线程改变而没有同步。
我还建议您也可以在Test
实例中创建所有变量/方法(main
除外),因为通常最好尽可能避免static
:
public class Test {
private Thread aThread;
private Loopy aLoop;
public static void main(String[] args) {
final Test test = new Test();
test.startUpdate();
test.stopUpdate();
test.startUpdate();
}
public void startUpdate() {
aLoop = new Loopy();
aThread = new Thread(aLoop);
aThread.start();
}
public void stopUpdate() {
if (aThread != null) {
aLoop.finish();
}
}
}
答案 1 :(得分:0)
我认为状态不应该是静态的