4

练习多线程java示例,这里我在A类中创建线程A,在B类中创建线程B。现在通过创建对象来启动这两个线程。这里我正在放置代码

  package com.sri.thread;

class A extends Thread
{
    public void run()
    {
        System.out.println("Thread A");
        for(int i=1;i<=5;i++)
        {
            System.out.println("From thread A i = " + i);
        }
        System.out.println("Exit from A");

    }
}
class B extends Thread
{
    public void run()
    {
        System.out.println("Thread B");
        for(int i=1;i<=5;i++)
        {
            System.out.println("From thread B i = " + i);
        }
        System.out.println("Exit from B");
    }
}
public class Thread_Class
{
    public static void main(String[] args)
    {
        new A().start();    //creating A class thread object and calling run method
        new B().start();    //creating B class thread object and calling run method
        System.out.println("End of main thread");
    }
//- See more at: http://www.java2all.com/1/1/17/95/Technology/CORE-JAVA/Multithreading/Creating-Thread#sthash.mKjq1tCb.dpuf

}

我不了解执行流程,通过调试尝试但没有得到它。执行流程如何。在这里我放置了让我感到困惑的输出。

    Thread A
Thread B
End of main thread
From thread B i = 1
From thread B i = 2
From thread B i = 3
From thread B i = 4
From thread B i = 5
Exit from B
From thread A i = 1
From thread A i = 2
From thread A i = 3
From thread A i = 4
From thread A i = 5
Exit from A

为什么线程 B 中的循环在进入线程 A 中的循环之前完成?

4

3 回答 3

5

除非您有多个处理器,否则线程在时间片的基础上共享一个处理器。执行其中一个线程的总时间可能少于时间片,因此无论哪个线程首先分派,都会在另一个线程运行之前完成。

尝试在运行方法中添加一个简短的 Thread.sleep 调用。

于 2013-08-10T14:56:18.293 回答
4

执行多个线程时,确实没有保证的执行顺序。线程彼此独立。

源代码中的链接解释了它:

在这里你可以看到两个输出是不同的,尽管我们的程序代码是相同的。它发生在线程程序中,因为它们自己同时运行。线程彼此独立运行,并且每个线程只要有机会就会执行。

于 2013-08-10T14:55:22.237 回答
1

线程同时执行。一个不在另一个内部执行。每个线程获取 CPU 时间,做一些工作,然后在 CPU 忙于其他事情时等待。根据计算机上发生的其他情况,它每次可能会以不同的方式运行。

如果您希望线程的输出消息是交错的,那么在某种程度上,如果您将循环增加到数千次迭代,它们将是交错的。现在代码完成得如此之快,很难看出它们真的是并行运行的。

于 2013-08-10T15:02:54.503 回答