繁体   English   中英

Java线程执行顺序

[英]java threads execution order

public class SousThread implements Runnable {
    private int i;

    public SousThread() {
        this.i = 0;
    }

    @Override
    public void run() {
        while(true) {
            System.out.println("I'm sousthread " + i++);
            try {
                Thread.sleep(1500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public class TestThread implements Runnable {

    @Override
    public void run() {
        System.out.println("I'm thread");
        SousThread st = new SousThread();
        Thread td = new Thread(st);
        td.start();
        System.out.println("thread finished");
    }

    public static void main(String[] args) {
        TestThread tt = new TestThread();
        Thread td = new Thread(tt);
        td.start();
        System.out.println("main finished");
    }
}

我试图创建线程SousThread螺纹TestThread SousThread是无限的。

令我惊讶的是,结果如下:

I'm thread
main finished
thread finished
I'm sousthread 0
I'm sousthread 1
I'm sousthread 2
I'm sousthread 3
I'm sousthread 4
I'm sousthread 5
...
...

这是否意味着main方法已完成而线程尚未完成? 这可能吗? 这样安全吗? 如果没有,更好的方法是什么?

更新

因为这样的代码在C ++中不起作用。 所以我只想知道代码是否在Java中没有任何问题或风险地工作。

这是有据可查且完全正常的:

Java虚拟机启动时,通常只有一个非守护线程(通常调用某些指定类的名为main的方法)。 Java虚拟机将继续执行线程,直到发生以下任何一种情况:

  • 已调用类Runtime的退出方法,并且安全管理器已允许进行退出操作。
  • 不是守护程序线程的 所有线程都已死,要么通过从调用返回到run方法,要么抛出传播到run方法之外的异常。

在您的情况下,尽管主线程已终止(通过main()返回隐式),但其他线程仍处于活动状态。 除非您在某个地方调用System.exit()或将其他线程设置为守护程序线程,否则JVM将继续运行,直到所有线程都已加入。

如果希望所有线程在主线程存在之前终止,则需要Thread.join() 请注意, Runtime.exit()非常严格地终止线程。 线程不会被中断,它们的终结器也不会被调用 ,因此这确实是不安全的。

您在代码中所做的操作说明如下:

  1. main线程首先由JVM启动
  2. TestThreadmain线程启动
  3. SousThread被启动TestThread

这是否意味着main方法已完成而线程尚未完成? 这可能吗?

是的, 每个线程平行运行main线程完成第一,然后TestThread完成,但SousThread线仍然运行(因为无限的while循环)。

另外,您需要记住的一点是, 您无法期望并保证哪个线程首先运行和完成 (除非您正在运行无限循环),您可以在此处开始并更多地了解线程。

是的,那是可能的。 如果要终止线程,则应在线程上调用setDaemon方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM