[英]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()
非常严格地终止线程。 线程不会被中断,它们的终结器也不会被调用 ,因此这确实是不安全的。
您在代码中所做的操作说明如下:
main
线程首先由JVM启动 TestThread
由main
线程启动 SousThread
被启动TestThread
这是否意味着main方法已完成而线程尚未完成? 这可能吗?
是的, 每个线程平行运行 , main
线程完成第一,然后TestThread
完成,但SousThread
线仍然运行(因为无限的while
循环)。
另外,您需要记住的一点是, 您无法期望并保证哪个线程首先运行和完成 (除非您正在运行无限循环),您可以在此处开始并更多地了解线程。
是的,那是可能的。 如果要终止线程,则应在线程上调用setDaemon方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.