看这两个程序关于多线程的解决方案

看这两个程序关于多线程的Java codepublic class MyThread implements Runnable{String myString YES

看这两个程序关于多线程的

Java code
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 < 1000;i++)            System.out.println(t.myString);            }}

我知道这里执行了两个线程是main和t,问题是t是在main中创建的且在程序运行到System.out.println(t.myString)之前就已经运行,按照这个执行顺序的话在t线程中myString已经被更改成NO了啊,为什么输出还有YES呢?并且结果是前面好多YES然后剩下的全是NO,为什么没有全为NO的情况呢?
Java code
public class Test {    public static int i = 0;    public static void main(String[] args) throws Exception {        for (int x = 0; x < 1000; x++) {            MyThread mt = new MyThread(x);            mt.start();        }        Thread.sleep(1000);//让上面的循环跑完        System.out.println(Test.i);    }}class MyThread extends Thread {    int loopNum;    MyThread(int loopNum) {        this.loopNum = loopNum;    }    public void run() {        Test.i = Test.i + 1;        if (loopNum == 999) {            System.out.println("loop end");        }    }}

这个地方为什么需要一个Thread.sleep(1000)来让上面的循环跑完啊?不是需要for执行完了才执行下一条语句吗?那么在for中创建的线程只有全部运行完了才退出for循环运行下条语句。

[解决办法]
第一问:
new Thread(t).start();还没执行到run时间片就到了
轮到main所在的线程执行,所以先打印了YES后面就全部是NO了
想要全部是NO在 new Thread(t).start();完加上Thread.sleep(100)可能差不多了

第二问:
for只负责启动1000个线程,但以后每个线程怎么运行就不能控制了
调用 Thread.sleep(1000);让main所在的线程睡眠1000ms让那1000个线程执行最后再打印结果
其实1000ms那1000个线程也不一定跑完的
[解决办法]
建议楼主去看下:

Java Threads, 2Ed (O'Reilly)

很好的一本书,讲的很清楚。

大家都曾经一样迷惑!
[解决办法]
引用楼主 theyoungest 的帖子:

我知道这里执行了两个线程是main和t,问题是t是在main中创建的且在程序运行到System.out.println(t.myString)之前就已经运行,按照这个执行顺序的话在t线程中myString已经被更改成NO了啊,为什么输出还有YES呢?并且结果是前面好多YES然后剩下的全是 NO,为什么没有全为NO的情况呢?

[解决办法]
这个要看当前CPU的时间片轮到了那个一个线程,main也是其中的一个线程序.第一段很容易理解,第二段代码,就算你的for循环创建了1000个线程,也许这时候,main的CPU时间还没有结束,还要继续往下执行main线程中的代码.不知道这样说可否理解.
[解决办法]
MyThread t = new MyThread();
 new Thread(t).start(); \\线程跑起时,主线程也进入下面的句语
 for (int i = 0;i < 1000;i++) System.out.println(t.myString);

倒底是谁快很难搞清楚.你说的情况也应该存在