thinking in java 中的一个不理解地方,请大家多多指教
情况是这样的:(一些没用的代码我去掉了)
public class SelfManaged implements Runnable {
private Thread t = new Thread(this);
public SelfManaged() { t.start(); } *******关键就是这里
public String toString() {
}
public void run() {
......
}
} /* Output:
然后书上说了:
This example is quite simple and
therefore probably safe, but you should be aware that starting threads inside a constructor
can be quite problematic, because another task might start executing before the constructor
has completed, which means the task may be able to access the object in an unstable state
就是红色的这句话我不懂,难道在一般的多线程情况下,构造函数的执行是不会被打断的?
[解决办法]
构造函数里面的执行的线程当然有可能会被打断。
翻译一下就是 因为另外的任务可能会在构造函数执行完之前就开始执行 也就是说构造函数可能在一个不稳定的情况下去读取一个对象。(就是说对象会被another task所改变)
不明白LZ什么问题哇?
[解决办法]
public class SelfManaged implements Runnable { private int countDown = 5; private Thread t = new Thread(this); public SelfManaged() { t.start(); } public String toString() { return Thread.currentThread().getName() + "(" + countDown + "), "; } public void run() { while(true) { System.out.print(this); if(--countDown == 0) return; } } public static void main(String[] args) { for(int i = 0; i < 5; i++) new SelfManaged(); }} /* Output:Thread-0(5), Thread-0(4), Thread-0(3), Thread-0(2), Thread-0(1), Thread-1(5), Thread-1(4), Thread-1(3), Thread-1(2), Thread-1(1), Thread-2(5), Thread-2(4), Thread-2(3), Thread-2(2), Thread-2(1), Thread-3(5), Thread-3(4), Thread-3(3), Thread-3(2), Thread-3(1), Thread-4(5), Thread-4(4), Thread-4(3), Thread-4(2), Thread-4(1),*///:~
[解决办法]