在线程内使用System.exit()后显示的主线程的输出

时间:2018-10-19 17:35:08

标签: java multithreading

我要学习Java中的线程。我刚刚创建了一个新线程,就可以了,我希望程序在完成某些操作后关闭,但是当我在线程内调用System.exit(0);时,程序将不会关闭!

代码:

public class Humaida
{
    public Thread thread;
    public Humaida()
    {
        thread = new Thread(() ->              //i guess it using lambda expression,i just copied it
        {
            try
            {
                System.out.println("inside thread");
                System.exit(0);            // i think this line have to close\terminate JVM or the whole program
            } catch (Exception e)
            {
                e.printStackTrace();
            }
        });
        thread.start();                           //IMO this should be last line to execute

        System.out.println("after thread.start"); //shouldn't be run cause System.exit(0); reached

        printIt("after reading thread");          // i used my method just to ensure that program running
    }

    public static void main(String[] args)
    {
        new Humaida();
    }

    public void printIt(String text)
    {
        System.out.println(text);
    }
}

我得到一些奇怪的输出,例如

1st run:
after thread.start
inside thread
Press any key to continue . . .

 2nd run:
after thread.start
after reading thread
inside thread
Press any key to continue . . .

3rd run:
after thread.start
inside thread
after reading thread
Press any key to continue . . .

让我们忘记相同代码的不同输出,这是另一个问题。

我搜索了一些解决方案,我尝试了System.exit(-1);thread.kill(),但是它也不起作用。

这是怎么回事?

System.exit(0);只是杀死了这个线程,而不是杀死了主线程吗?

2 个答案:

答案 0 :(得分:1)

线程的重点是并行执行操作。您所看到的是比赛条件。

当您执行thread.start();时,它将开始在线程中运行代码,而且还将立即继续执行System.out.println("after thread.start");语句。这就是为什么您可能会看到两者的原因。

如果要等到线程完成,可以执行以下操作:

    thread.start();                           
    try {
      System.out.println("Main thread waiting for new thread to finish");
      thread.join();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }

在这种情况下,您将看到整个VM在线程完成之前退出。

答案 1 :(得分:0)

出于教育目的,请尝试在System.exit()之后放置另一个println(“ Say what?”)。如果“说什么?”显示,肯定有问题。

您已经在两个线程之间创建了竞争条件。第一个线程到达的距离取决于新线程运行的速度。唯一可以保证显示的是“内部线程”。