线程执行输出

时间:2018-04-26 17:58:46

标签: java multithreading

对于给定的代码段:

public static void main(String[] args) throws InterruptedException {
    Runnable r = new Runnable() {
        public void run() {
            System.out.print(Thread.currentThread().getName());
        }
    };

    Thread t1 = new Thread(r, "One ");
    t1.start();
    t1.sleep(2000);

    Thread t2 = new Thread(r, "Two ");
    t2.start();
    t2.sleep(1000);

    System.out.print("Main ");
}

输出始终为" One" "两个" "主&#34 ;.为什么在这段代码中有线程的这种行为?为什么总是" t1"是先开始而不是" t2"或者那个问题的主线?

2 个答案:

答案 0 :(得分:4)

Thread.sleep()静态方法,用于暂停当前线程。 "当前"这里的线程表示调用sleep()调用的"线程":在此代码中总是主线程。

所以你的代码等同于,应该写成

public static void main(String[] args) throws InterruptedException {
    Runnable r = new Runnable() {
        public void run() {
            System.out.print(Thread.currentThread().getName());
        }
    };

    Thread t1 = new Thread(r, "One ");
    t1.start();
    Thread.sleep(2000);

    Thread t2 = new Thread(r, "Two ");
    t2.start();
    Thread.sleep(1000);

    System.out.print("Main ");
}

当您启动t1,暂停主题两秒钟,然后启动t2,暂停主题时,会发生什么?再过一秒,然后将"Main "打印到控制台。

从技术上讲,无法保证调用t1.start()System.out.println("One ")(来自t1的'runnable)之间有多长时间,并且无法保证调用t2.start()System.out.println("Two ")之间的时间长度。但是,出于所有实际目的,这些将至多为毫秒级。

但是,保证在致电t1.start()t2.start()之间至少有两秒钟,并且在致电t2.start()和{{1}之间至少会有一秒钟}}

因此,出于所有实际目的,您将System.out.println("Main ")打印到控制台,然后两秒钟(最多加上或减去几毫秒),稍后将"One "打印到控制台,然后再打印一秒钟(加上或减去几毫秒)后来打印"Two "

当您通过对象引用引用静态方法时,任何好的(和合理配置的)IDE都会发出警告,就像使用"Main "等一样。您不应该忽略这些警告并且应该更正代码,这样你做得更清楚。

答案 1 :(得分:0)

这里我们总共有三个线程 main t1 t2 。当执行开始时,池中的所有线程都是异步执行的,因为相同优先级的线程由java调度程序给予相同的处理,因此它们以先来先服务运行。

使用threadname.setPriority(intNum)方法分配优先级,这会影响正在运行的线程的顺序。