Java 线程在执行过程中被置乱

Java 线程在执行过程中被置乱,java,multithreading,threadpool,Java,Multithreading,Threadpool,在下面的代码段中,我创建了3个线程,并给它们一个数字来跟踪哪个线程。当我执行程序时,输出与预期一样,只是线程是随机排序的。我本以为它们会以与创建时相同的顺序出现&从1-2-3开始,但每次我都会得到一个混乱的结果 为什么会这样 PrintTask对象创建随机睡眠时间,并在睡眠结束时打印消息。代码很简单,所以我不会发布它。当我使用ExecutorService而不是单独的线程对象时,也会发生同样的情况 public static void main(String[] args) { Thre

在下面的代码段中,我创建了3个线程,并给它们一个数字来跟踪哪个线程。当我执行程序时,输出与预期一样,只是线程是随机排序的。我本以为它们会以与创建时相同的顺序出现&从1-2-3开始,但每次我都会得到一个混乱的结果

为什么会这样

PrintTask对象创建随机睡眠时间,并在睡眠结束时打印消息。代码很简单,所以我不会发布它。当我使用ExecutorService而不是单独的线程对象时,也会发生同样的情况

public static void main(String[] args) {
    Thread thread1 = new Thread(new PrintTask("Thread 1"));
    Thread thread2 = new Thread(new PrintTask("Thread 2"));
    Thread thread3 = new Thread(new PrintTask("Thread 3"));

    System.err.println("Starting threads");

    thread1.start();
    thread2.start();
    thread3.start();

    System.err.println("Threads started, main ends\n");
}
输出:

线程2睡眠4907

线程1为4779准备睡眠

线程3将为537睡眠

线程3完成睡眠

线程1已完成睡眠

线程2已完成睡眠

我本以为他们会按照创建和启动1-2-3的顺序出现

不,不保证线程执行的顺序

我本以为他们会按照创建和启动1-2-3的顺序出现


不,不保证线程执行的顺序

您唯一的保证是:

对线程的启动调用发生在已启动线程中的任何操作之前


但是,当涉及多个线程时,没有保证,因此您需要使用某种形式的同步来获得所需的输出。

唯一的保证是:

对线程的启动调用发生在已启动线程中的任何操作之前

但是当涉及多个线程时无法保证,因此需要使用某种形式的同步来获得所需的输出

我本以为他们会按照创建和启动1-2-3的顺序出现

没有提供此类担保

我本以为他们会按照创建和启动1-2-3的顺序出现


没有这样的保证。

线程的调度方式取决于许多因素,包括任何框架调度器、操作系统调度器、硬件等。在没有任何明确协调的情况下,您永远不应该依赖于并发执行线程之间的特定操作顺序。在启动和实际执行第一条指令之间,调度程序很可能会将线程从CPU上取下。

如何调度线程运行取决于许多因素,包括任何框架调度程序、操作系统调度程序、硬件、,在没有任何显式协调的情况下,您永远不应该依赖于并发执行线程之间的特定操作顺序。在启动和实际执行第一条指令之间,调度程序很可能会从CPU上取下一个线程。

为什么您认为它们会按顺序出现?不能保证线程被赋予时间片的顺序线程的全部目的是执行独立的任务。如果您希望任务以特定的顺序执行,您将使用循环,而不是创建线程。为什么您认为它们会按顺序出现?不能保证线程被赋予时间片的顺序线程的全部目的是执行独立的任务。如果您希望按特定顺序执行任务,您可以使用循环,而不是创建线程。我曾使用execute方法使用executeService进行过尝试,但没有任何区别。我也用submit尝试过,但也没有什么不同。我用execute方法用executeService尝试过,但没有什么不同。我也尝试过提交,但也没什么不同。