当输出不是A / B / BC / AD(/是新行)时是否有任何情况?第二个Thread可能在第一个之前启动吗?
public class JavaApplication6 extends Thread{
final StringBuffer sb1 = new StringBuffer();
final StringBuffer sb2 = new StringBuffer();
public static void main(String[] args) throws InterruptedException {
final JavaApplication6 h = new JavaApplication6();
new Thread(){
public void run(){
synchronized(this){
h.sb1.append("A");
h.sb2.append("B");
System.out.println(h.sb1);
System.out.println(h.sb2);
}
}
}.start();
new Thread(){
public void run(){
synchronized(this){
h.sb1.append("D");
h.sb2.append("C");
System.out.println(h.sb2);
System.out.println(h.sb1);
}
}
}.start();
}}
答案 0 :(得分:0)
是的,第二个线程可以在第一个之前启动。
这可能是因为线程调度程序以不可预测的方式启动线程。
此外:首先可以先启动,但最后完成,因为线程之间的切换(由提到的线程调度程序做出)。
即使您多次运行此应用并“证明”订单相同,也无法保证此订单不会在下次运行时发生变化。
答案 1 :(得分:0)
是的,第二个线程可以在第一个线程之前启动。 它完全取决于线程调度程序。一旦创建了线程,它们就会转移到可运行状态,然后它就是线程调度程序负责执行哪个线程。无法保证首先启动和完成哪个线程。您可以通过在循环中执行此方法来尝试此行为 -
public static void abc() throws InterruptedException {
final JavaApplication6 h = new JavaApplication6();
new Thread(){
public void run(){
synchronized(this){
System.out.println("T-10000000000");
}
}
}.start();
new Thread(){
public void run(){
synchronized(this){
System.out.println("T-2");
}
}
}.start();
}}
public class JavaApplication61 {
public static void main(String ar[]) throws InterruptedException{
for(int i=0; i<100;i++){
JavaApplication6.abc();
}
}
}