看这两个程序关于多线程的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)
很好的一本书,讲的很清楚。
大家都曾经一样迷惑!
[解决办法]
[解决办法]
这个要看当前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);
倒底是谁快很难搞清楚.你说的情况也应该存在
