实际上如何开始();适用于Java线程

时间:2015-10-02 22:35:01

标签: java

以下是示例代码:

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();

我真的试图搜索一下,但无法找到这个查询。

3 个答案:

答案 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(),但是当你发生上下文切换时,你永远无法说出你真正的汇编指令。