日期:2014-05-20  浏览次数:20715 次

看这两个程序关于多线程的
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);

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