以下是示例代码:
public class HelloRunnable implements Runnable {
@Override
public void run() {
System.out.println("Run Entered");
}
public static void main(String args[]) {
Thread obj=new Thread(new HelloRunnable());
obj.start();
System.out.println("ABC");
}
}
输出:
ABC
Run Entered
为什么ABC在run()'s
代码之前?
即使我创建3个线程。但ABC仍然首先打印;
obj.start();
obj1.start();
obj2.start();
我真的试图搜索一下,但无法找到这个查询。
答案 0 :(得分:1)
仅仅因为HelloRunnable.run
方法在另一个线程中执行而不是打印ABC
。它们并发执行,这就是线程的重点。因此,两者中的任何一个都可以在另一个之前访问某个资源,如stdout。
答案 1 :(得分:0)
会反过来或像这样。你开始了一个“线程”。您正在主线程上运行。所以你有两个独立的运行代码。你如何保证一个人能够完成另一个人的工作?
尝试在启动其他线程后休眠主线程。随着
Thread.sleep(2000);
然后其他线程将完成他们的工作。你可以看到ABC打印的最后一个。
public class HelloRunnable implements Runnable {
@Override
public void run() {
System.out.println("Run Entered");
}
public static void main(String args[]) {
Thread obj=new Thread(new HelloRunnable());
obj.start();
try{
Thread.sleep(2000);
}
catch(Exception e){}
System.out.println("ABC");
}
}
它们是平行作品,因此您无法保证ABC最后或首先打印。取决于机器CPU,你有工作。
答案 2 :(得分:0)
当你调用obj.start()时,它会在内部生成一个新线程。所以在那个阶段,你的进程中有2个线程,一个是主线程,一个是新线程。
每个线程都需要cpu来执行,并且由cpu调度队列驱动。如果主线程持有cpu,那么out put将是你所看到的。如果在语句obj.start()之后发生了上下文切换,那么cpu被赋予新线程,那么你将首先看到线程输出,然后是主输出。
所以这种行为是不确定的,因为你永远无法预测在哪个语句之后会发生上下文切换。
你在代码中看到的也不是在cpu上执行的内容。在cpu程序集执行。因此,即使你说你正在执行obj.start(),但是当你发生上下文切换时,你永远无法说出你真正的汇编指令。