为什么 "main method"println 先打印

why "main method"println is printing first

我正在尝试编写一个程序来中断子线程。

但为什么先打印 System.out.println("main method") 然后执行 t.run()

import java.util.*;
import java.lang.*;
import java.io.*;


class TryCatchReturn extends Thread
{

  public void run()
  {
    for(int i=0;i<5;i++)
    {
        try
        {
            System.out.println("i will get interrupted");
        }
        catch (Exception e)
        {
            System.out.println("catch interruputed");
        }
    }
  }

}



class Ideone
{
  public static void main (String[] args) throws java.lang.Exception
  {
    TryCatchReturn t=new TryCatchReturn();
    t.start();
    t.interrupt();
    System.out.println("main method");
  }
}

您发起了话题。 Main 方法的下一行代码不会等待您的线程完成。

正如评论中所讨论的那样,当您调用 start() 方法时,线程 maint 运行 同时执行,因此无法保证线程的执行顺序. run() 方法将在末尾打印 "main method",因为它在同一线程上 运行s。有 运行 你的程序,我在调试时得到以下输出。

我在第一个实例中也得到了你的输出(没有调试),这表明顺序是不确定的...:)

希望对您有所帮助!

If the thread is not in the sleeping or waiting state, calling the interrupt() method performs the normal behaviour and doesn't interrupt the thread but sets the interrupt flag to true.

所以正如Yunes所说,主线程和新线程共存运行在一起

另请参阅 this

欢迎使用多线程。

这是正在发生的事情:

  1. 首先,您有一个线程(执行 main 方法的线程)。
  2. 您创建了第二个线程(在 main 方法中)。
    -ma 主线程继续执行,调用中断方法
    -mb 主线程继续执行并调用System.out.println方法。
    -2a 新线程开始执行并调用System.out.println方法。
    -2bi 新线程中断,调用System.out.println方法
    -2bii 新线程继续执行,退出for循环

唯一保证的执行顺序如下:

第 1 步先发生。
第二步发生。
所有以“-”开头的步骤都发生在步骤 2 之后。
step -mb 发生在 step -ma
之后 步骤 -2a 发生在步骤 -2bi 和 -2bii

之前

您无法预测步骤-2bi 或步骤-2bii 是否会发生。 这取决于线程执行顺序。

如果将循环从 5 更改为 5000000,则步骤 -2bi 比步骤 -2bii 更有可能发生

当你 运行 程序将创建两个线程,一个是主线程,其中主要方法 运行s 另一个是 't' 类型为 TryCatchReturn 的线程.

当您在 main() 方法中调用 start() 方法时,mainThread 和 t 线程都会按照自己的节奏开始和结束。有时 mainThread 可能先完成,有时 t 线程可能完成其执行。

如果你想让t线程先完成,那么你必须告诉主线程等待t线程的执行。这是使用 join() 方法完成的。

您还可以通过调用 sleep() 方法让主线程暂停执行一段时间。