对于给定的代码段:
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"或者那个问题的主线?
答案 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)
方法分配优先级,这会影响正在运行的线程的顺序。