当前位置: 首页 > 面试题库 >

即使我运行程序也获得不同的线程顺序

方博
2023-03-14
问题内容

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

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:我是线程的新手,这是我的第一个线程程序。提前致谢。


问题答案:

当我执行此代码时,我得到许多不同的输出。

这是预期的。该顺序未定义,并且随着线程开始运行并由OS进行线程调度而受竞争条件的影响。

我们编写多线程应用程序的全部原因是线程是异步的,并且出于速度原因而在单独的处理器中运行。为了保证特定的输出顺序,您可以在带有锁之类的线程之间进行同步,但是这样会降低性能,并且减少了派生线程的整个原因。



 类似资料:
  • 问题内容: 您将如何依次执行三个线程?例如。线程1,线程2,线程3。不可能将一个线程的引用传递给另一个线程并从run()方法调用。 因此代码应如下所示: 并应该把 这可以通过使用ThreadPoolExecutor并使用阻塞队列来实现,但即使那样也不是可以接受的答案。 问题答案: 在java.util.concurrent包中使用ExecutorService。更精确地使用

  • 问题内容: 我正在尝试在我正在处理的Python项目中使用线程,但是线程似乎没有按照我的代码的预期运行。似乎所有线程都按顺序运行(即,线程2在线程1结束后开始,它们不是同时启动)。我编写了一个简单的脚本来对此进行测试,并且该脚本也按顺序运行线程。 这是我从运行它得到的输出: 循环的迭代次数更多时,观察到相同的行为。 我尝试搜索网络和较早的SO答案,但找不到任何有帮助的方法。有人可以指出这段代码有什

  • 问题内容: 我有3个线程第一打印A第二打印B第三打印C 我想按顺序打印ABCABCABC,依此类推..... 因此,我在下面编写了程序,但无法实现相同的目的。我知道一个问题,当时状态为1时,例如B1和C1线程正在等待,而当我做notifyAll()时,两个等待线程都被唤醒,并且取决于CPU分配,它可能会打印B或C。 在这种情况下,我只希望在A之后打印B。 我需要做什么修改。 问题答案: 将那些IF

  • 我尝试使用ArrayList解决生产者和消费者问题(我知道ArrayList是nt threadsafe),我确保使用关键字放置列表,但仍然进入。这就是错误 启动生产者请提供作业详细信息:TestJob作业完成:TestJob Exception位于java.util.ArrayList$itr.checkforcoModification(未知源)位于test.thread.consumer.r

  • 问题内容: 我尝试从一本书(Paul Hyde,Java Thread Programming)中运行示例。它说线程的顺序将互换。但是我总是得到:之后打印10个“主线程”,然后打印10个“新线程”。更有趣的是:如果我将使用tt.run而不是tt.start,那么结果将相反。也许这本书太老了,示例基于JDK 1.2的原因???代码如下: 问题答案: JVM决定何时将控制权从主线程转移到第二个线程。由

  • 在我的应用程序中,在程序的整个生命周期中,有n个操作必须依次发生。我决定为每个操作创建一个线程,让它们执行一次run方法,然后等待所有其他线程都执行相同的操作,等待轮到它,然后再次执行,依此类推,而不是创建实现这些操作的方法并在while(true)循环中按顺序调用它们。。。 为了实现这个机制,我创建了一个名为StatusHolder的类,它有一个名为threadTurn的字段(表示应该执行哪个线