有人可以告诉我线程开始执行的顺序吗?我写了以下代码
class NewThread implements Runnable {
Thread t;
NewThread() {
//creating a second thread.
t=new Thread(this,"Demo Thread");
System.out.println("Child Thread:"+t);
t.start();
}
public void run() {
try {
for(int i=0;i<5;i++) {
System.out.println("Child Thread:"+i);
Thread.sleep(3000);
}
} catch(Exception e) {
System.out.println(e.getLocalizedMessage());
}
System.out.println("Exiting Child Thread");
}
}
和这个
public class ThreadDemo {
public static void main(String args[]) {
new NewThread();
try {
for(int i=0;i<5;i++) {
System.out.println("Main Thread:"+i);
Thread.sleep(3000);
}
} catch(Exception e) {
System.out.println(e.getLocalizedMessage());
}
System.out.println("Exiting Main Thread");
}
}
当我执行此代码时,我会得到许多不同的输出集。
Child Thread:Thread[Demo Thread,5,main]
Main Thread:0
Child Thread:0
Child Thread:1
Main Thread:1
Main Thread:2
Child Thread:2
Main Thread:3
Child Thread:3
Main Thread:4
Child Thread:4
Exiting Main Thread
Exiting Child Thread
另一个,
Child Thread:Thread[Demo Thread,5,main]
Main Thread:0
Child Thread:0
Child Thread:1
Main Thread:1
Child Thread:2
Main Thread:2
Child Thread:3
Main Thread:3
Child Thread:4
Main Thread:4
Exiting Child Thread
Exiting Main Thread
为什么会这样?线程顺序永远不会相同吗?如果有人可以给我指向线程和示例的基础知识,那就太好了。 P.S:我是线程的新手,这是我的第一个线程程序。提前谢谢。
答案 0 :(得分:8)
当我执行此代码时,我会得到许多不同的输出集。
这是预期的。订单未定义,并且在线程开始运行时受到竞争条件的影响,并且由操作系统进行线程调度。
我们编写多线程应用程序的全部原因是线程是异步的,并且出于速度原因在单独的处理器中运行。为了保证特定的输出顺序,您可以在具有锁等的线程之间进行同步,但是您会失去性能,并且分支线程的整个原因将会减少。
答案 1 :(得分:0)
您遇到了竞争条件。
您偶然发现了多线程的复杂性之一。如果你有必须按特定顺序处理的代码,你必须“锁定”该代码和/或在其中声明变量“volatile”。运行谷歌搜索“死锁”和“竞争条件”。
答案 2 :(得分:0)
没有隐含的顺序。如果必须有订单,请使用Quecut深度为1的ExecutorService。