你觉得下面的程序输出的是10个"No"吗?
public class MyThread implements Runnable {
String myString = "Yes ";
public void run() {
this.myString = "No ";
}
public static void main(String[] args) {
MyThread t = new MyThread();
new Thread(t).start();
for (int i=0; i < 10; i++)
System.out.print(t.myString);
}
}
首先可以肯定地讲, 结果是不可预知的, 也就是说并不能肯定输出的是多少个"No"或者是否还包括有"Yes".
当在程序的这一行"new Thread(t).start()"执行完后, 如果此时的线程立刻被执行了并且没有任何耽搁, 那么结果肯定是10个"No", 但start方法并不是调用什么线程的run方法来强制执行线程, 而是start方法只简单地发出一个通知, 告知操作系统和其它的正在执行中的线程, 说"我这个线程此时属于可执行状态", 并且在线程队列里轮到此线程执行时, 这时此线程才得以执行. 所以说在这些繁琐的步骤里另一方面主程序线程可能早已经到了for循环处, 但此时可能执行的start方法的那个线程还没有得到执行, 这样输出就可能是几个"Yes"再加几个"No", 其二者的个数也是无法得知的(但有一点可以肯定, "Yes"和"No"加起来的总数肯定是10个), 因为谁也不能预知被通知的线程会在什么被执行起来.