Java线程新线程顺序

Java线程新线程顺序,java,multithreading,Java,Multithreading,一些结果 //Class PrintTask sleeps between0-5 seconds import java.util.Random; public class PrintTask implements Runnable{ private final int sleeptime; private final String taskname; private final static Random generator= new Random(); public PrintTask(S

一些结果

//Class PrintTask sleeps between0-5 seconds
import java.util.Random;
public class PrintTask implements Runnable{
private final int sleeptime;
private final String taskname;
private final static Random generator= new Random();

public PrintTask(String name)
{
    taskname=name;
    sleeptime=generator.nextInt(5000);

}

public void run()
{
    try 
    {
        System.out.printf("%s going to sleep for %d ms.\n", taskname,sleeptime);
        Thread.sleep(sleeptime);

    }
    catch(InterruptedException exception)
    {
        System.out.printf("%s %s\n", taskname,"terminated prematurely due to interruption");
    }
    System.out.printf("%s done sleeping\n",taskname);



}

}


//Creation and start of three threads 
import java.lang.Thread;
public class Threads {

public static void main(String[] args) {
    System.err.println("Creating threads");
    Thread  thread1=new Thread(new PrintTask("task1"));
    Thread  thread2=new Thread(new PrintTask("task2"));
    Thread  thread3=new Thread(new PrintTask("task3"));

    thread1.start();
    thread2.start();
    thread3.start();
    System.err.println("Tasks Started. Main Ends. \n");
}

}
我的问题是,为什么消息“task”将休眠**ms,而不是以正确的顺序出现,如下所示:(有时它可能以“正确”的顺序出现)

但它似乎是以随机顺序出现的。我是线程新手,所以请尽可能简单地回答我。
谢谢大家!

您正在创建线程并将其发送给某种调度程序

这些线程由JVM(或操作系统)以无特殊顺序启动

更新:


正如@Braj在评论中提到的,您可以通过设置线程优先级来影响执行顺序。

一般来说,JVM线程映射到一些操作系统本机线程,操作系统将使用什么调度算法来选取这些线程执行。一般来说,如果所有线程具有相同的优先级,并且它们是“可运行的”(即处于可运行状态,没有阻塞或等待),那么要运行的线程的选择是随机的,取决于它运行的操作系统

在多线程程序中,3不能保证线程的执行。所有线程都具有相同的优先级,因此任何一个线程都可以进入可运行状态。因此它实际上是随机的,并且没有与睡眠时间相关的模式?是的,它是随机的。以这种方式尝试
thread1.setPriority(7);线程2.设置优先级(5);线程3.设置优先级(3)
start()
之前。你不能控制线程的顺序,这就是线程的要点。你可以优先提出“建议”,但它们实际上就是这样。如果您需要确定顺序的执行,线程不是您的朋友。您可以在线程之间放置一些队列,以便自己强制执行排序,但现在您的情况并不比在单个线程上以线性方式执行任务好多少。
task2 going to sleep for 320 ms.
task1 going to sleep for 3054 ms.
task3 going to sleep for 1821 ms.
task2 done sleeping
task3 done sleeping
task1 done sleeping

task2 going to sleep for 1338 ms.
task3 going to sleep for 2825 ms.
task1 going to sleep for 3461 ms.
task2 done sleeping
task3 done sleeping
task1 done sleeping
task1 going to sleep for **** ms.
task2 going to sleep for **** ms.
task3 going to sleep for **** ms.