如何真正开始();在Java线程中工作

如何真正开始();在Java线程中工作,java,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());

下面是示例代码:

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
为什么在
run()的
代码之前先进行ABC

甚至我也创建了3个线程。但还是先印ABC

obj.start();
obj1.start();
obj2.start();

实际上,我试图搜索这个,但是找不到这个的查询。

原因很简单,因为
HelloRunnable.run
方法是在打印
ABC
的线程之外的另一个线程中执行的。它们并发执行,这就是线程的要点。因此,两者中的任何一个都可以在另一个之前访问特定的资源,比如标准输出

则相反或类似于此。你开始了一个“线程”。您正在主线程上运行。所以您有两个独立的运行代码。你如何保证一个会比另一个先完成工作

尝试在启动其他线程后休眠主线程。与

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,你的作品

调用obj.start()时,它会在内部生成一个新线程。所以在那个阶段,您的进程中有两个线程,一个是主线程,一个是新线程

每个线程都需要cpu来执行,这是由cpu调度队列驱动的。如果主线程持有cpu,那么输出将是您所看到的。如果上下文切换正好发生在语句obj.start()之后;然后cpu被赋予新线程,然后您将首先看到线程输出,然后是主输出

因此,该行为是不确定的,因为您永远无法预测在哪个语句之后会发生上下文切换


此外,您在代码中看到的并不是在cpu上执行的内容。在cpu上执行程序集。因此,即使您说您正在执行obj.start(),但您永远也不能说在发生上下文切换时您实际上是在哪个汇编指令上执行的。

java线程中的一行执行是不确定的。当您执行
obj.start()时
然后本质上你正在启动一个新线程,它的执行顺序是不确定的。答案很可能是调用
start
的线程已经在运行,而执行
run
的线程需要一些时间来启动。让我们先看看线程可能处于的各种状态:。也就是说,对“start”的调用不会像立即执行线程那样运行。它将线程置于
runnable
状态,这意味着在
n
线程处于runnable状态时,schedular可以选择任何一个线程并开始执行,从而将其置于
running
状态。因此,调用
start
只是让线程可以运行或准备好运行,并由schedular决定是否运行run@Satarangi_Re谢谢你的链接,让我看看所有的。@satrangi\u Re我已经知道这个状态了。但是我不知道怎么解释。对不起,我的英语很差。你能简单地解释一下吗。据我所知,您的答案是,线程执行时无法保证。您会说什么其他语言-?:D我会说法语和西班牙语,但如果你想成为一名程序员,你应该习惯英语(例如,如果你继续阅读和写作,这将自然而然地发生)乌尔都语:)Ritish的回答澄清了我的概念,也提出了更多关于线程CPU机制的问题。因为现在我要搜索查询。基本思想是,在一个顺序程序中,所有指令都以确定的顺序执行,而并发程序的指令以任何可能的顺序执行。如果需要特定的顺序,则需要使用同步来强制执行。很抱歉我不会说乌尔都语:祝你搜索好运不要害怕问(好)问题,毕竟这是一个QA网站。您似乎已经理解了这个小代码。执行
start
后,主线程转到下一条指令,同时启动一个新线程。接下来发生的事情是不确定的,方法“main”是您开始运行代码的地方。这是主线程区,所有的处理流程都在这里。分叉线程时,它们与主线程不同。假设您有不同的进程,但它们在同一个可执行进程中。他们有不同的工作/任务。有重有轻。我怎么能睡主线?因此,我将能够在最后打印ABC。这将是我最后的评论,因为我不想因为我的理解力差而打扰你更多。。!!有两条线。。!!第一个main的线程是创建另一个线程
obj.start()
println(“ABC”)首先它将通过
obj.start()创建线程但该线程处于可运行阶段,此时main的线程将执行自己的其他指令,然后下一个是
println(“ABC”),我是对的?
main
线程与其他线程相同(线程对象等)?或者这只是CPU的任务?@NewBie CPU调度队列对所有线程都一视同仁。还有其他方法可以更改线程的优先级,但这是不同的问题。