为什么“主要方法”println首先打印

时间:2017-06-28 18:12:28

标签: java multithreading interrupt thread-sleep

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

但为什么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");
  }
}

5 个答案:

答案 0 :(得分:0)

你开始了这个主题。主方法的下一行代码不会等待你的线程完成。

答案 1 :(得分:0)

正如在注释中所讨论的那样,由于线程maint在调用start()方法时并发运行,因此无法保证线程执行顺序。 run()方法在最后打印“main方法”,因为它在同一个线程上运行。运行你的程序,我在调试时获得了以下输出。

Threads output

我也在第一个实例上得到了你的输出(没有调试),这传达了命令是非确定性的......:)

希望这有帮助!

答案 2 :(得分:0)

  

如果线程未处于休眠或等待状态,则调用   interrupt()方法执行正常行为并且不会中断   线程但将中断标志设置为true。

正如Yunes所提到的,主线程和新线程共存并一起运行。

另请查看this

答案 3 :(得分:0)

欢迎使用多线程。

以下是发生的事情:

  1. 首先,您有一个线程(主方法正在执行的线程)。
  2. 您创建第二个主题(在主方法中) -ma主线程继续执行并调用中断方法 -mb主线程继续执行并调用System.out.println方法 -2a新线程开始执行并调用System.out.println方法 -2bi新线程被中断并调用System.out.println方法 -2bii新线程继续执行并退出for循环。
  3. 唯一有保证的执行顺序如下:

    首先发生第1步   第二步发生在第二位   以&#34; - &#34;开头的所有步骤发生在第2步之后。
      步骤-mb发生在步骤-ma
    之后   步骤-2a发生在步骤-2bi和-2bii之前

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

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

答案 4 :(得分:0)

当你运行程序时,将创建两个线程,一个是主方法运行的主线程,另一个是&#39; t&#39; TryCatchReturn类型的线程。

当你在main()方法中调用start()方法时,mainThread和t线程都会按照自己的步调启动和完成。有时mainThread可能会先完成,有时候线程可能会完成执行。

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

你也可以通过调用 sleep()方法让主线程执行一段时间。