2

有人可以告诉我线程开始执行的顺序吗?我写了以下代码

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

为什么会出现这种情况?线程顺序永远不会相同吗?如果有人能给我指点线程和示例的基础知识,那就太好了。PS:我是线程新手,这是我的第一个线程程序。提前致谢。

4

3 回答 3

8

当我执行这段代码时,我得到了许多不同的输出集。

这是意料之中的。该顺序未定义,并且在线程开始运行时受制于竞争条件,并受制于操作系统的线程调度。

我们编写多线程应用程序的全部原因是线程是异步的,并且出于速度原因在单独的处理器中运行。为了保证特定的输出顺序,您可以使用锁等在线程之间进行同步,但是您会失去性能,并且分叉线程的全部原因将会减少。

于 2012-06-18T15:24:06.443 回答
0

您遇到了竞争条件。

您偶然发现了多线程的复杂性之一。如果您有必须以特定顺序处理的代码,您必须“锁定”该代码和/或在其中声明变量“易失性”。运行谷歌搜索“死锁”和“竞争条件”。

于 2012-06-18T15:25:47.517 回答
0

没有隐含的顺序。如果必须有订单,请使用队列深度为 1 的 ExecutorService。

于 2012-06-18T15:26:41.790 回答