首页 新闻 会员 周边

java编程思想中关于线程启动的一个疑问

0
悬赏园豆:20 [已解决问题] 解决于 2012-11-13 16:31
Java code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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:


java编程思想英文第4版,1137 页,第二自然段," 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",作者的意思是,不宜在构造里开启线程,因为有可能新的线程启动时,构造还未执行完,这时等于在用这个新线程来驱动一个不稳定的任务对象(毕竟构造未执行完,初始化任务还未做完)。
我的疑问在于:示例代码中,t.start()放在构造函数最后一行,这时只t.start()语句执行完,接着构造函数也执行完了(函数返回是原子操作,t.start()后面无其他语句,所以执行构造函数的线程不会中断),然后新的线程才会启动。不明白作者为何还说示例代码有问题,而且在后来的示例代码中,作者多次都在构造里启动线程(放在构造最后一行)。
总之我的意思是:只要保证在构造最后一行启动线程,那么在构造中启动线程就完全不会有任何问题,不是我的看法是否正确。求指点!能有反例代码最好!

加州招待所的主页 加州招待所 | 初学一级 | 园豆:134
提问于:2012-11-13 00:07
< >
分享
最佳答案
0

 t.start()虽然是一句话,但这个函数会使run整个函数体运行,这样构造函数和run同时运行,这样就可能造成start函数的异常,此时构造函数中就会出现异常,构造函数出现异常一般都是需要避免的

收获园豆:20
2012 | 高人七级 |园豆:21230 | 2012-11-13 08:40
其他回答(1)
0

支持一楼,一楼对底层的东东很了解...

Hongten | 园豆:1768 (小虾三级) | 2012-11-13 10:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册