- Java多个线程,什么时候被创建,什么时候退出?
- java程序的入口是什么?
- java主线程main结束后,是否程序就结束了?C中的(windows,linux)main函数执行完,整个进程结束,其子线程也被强制结束退出。这个是C/C++与java很大的不同。C/C++,通常需要主线程主动等待子线程完成再退出。而java不需要在main函数中显式等待子线程(非Daemon线程)退出,而是自动创建DestroyJavaVM线程来管理。
JAVA线程分为2类
Daemon线程(守护线程)和User线程(用户线程)
Daemon线程,是启动前可以通过setDaemon(true)来指定线程为Daemon线程
JAVA虚拟机启动程序步骤:
(1) Main是启动时候的主线程,即程序入口
(2) 在main函数结束后,虚拟机会自动启动一个DestroyJavaVM线程,该线程会等待所有user thread 线程结束后退出(即,只剩下daemon 线程和DestroyJavaVM线程自己,整个虚拟机就退出,此时daemon线程被终止),因此,如果不希望程序退出,只要创建一个非daemon的子线程,让线程不停的sleep即可。
线程的创建
Thread类,有一个start方法,即启动该线程。 启动的线程会执行该类的run方法。注意:因为启动线程时要执行某个过程,因此,通常是需要重新实现run方法的
线程的结束
run模块执行完成主动退出,或者被其他线程强行终止。
下面代码用于显示:系统当前运行的线程情况,begin和end之间是 打印所有线程。
实现是基于ThreadGroup实现的
打印的测试结果如下:(代码附上)Thread-0是main线程启动的一个user thread。冒号后面是线程名称
begin.....
Thead 0:main
Thead 1:Thread-0
end.....
begin.....
Thead 0:main
Thead 1:Thread-0
end.....
begin.....
Thead 0:main
Thead 1:Thread-0
end.....
begin.....
Thead 0:main
Thead 1:Thread-0
end.....
begin.....
Thead 0:Thread-0
Thead 1:DestroyJavaVM
end.....
begin.....
Thead 0:Thread-0
Thead 1:DestroyJavaVM
end.....
begin.....
Thead 0:Thread-0
Thead 1:DestroyJavaVM
end.....
测试代码:
public class Main {
public static void main(String args[]) {
new Thread() {
public void run() {
int i=100;
while (i-->0) {
try {
sleep(10);
printAllThreadNames();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
int i = 5;
while (i-->0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void printAllThreadNames() {
ThreadGroup group = Thread.currentThread().getThreadGroup();
ThreadGroup topGroup = group;
int estimatedSize = topGroup.activeCount() * 2;
Thread[] slackList = new Thread[estimatedSize];
int actualSize = topGroup.enumerate(slackList);
System.out.println("begin.....");
for (int i = 0; i < actualSize; i++) {
System.out.println("Thead " + i + ":" + slackList[i].getName());
}
System.out.println("end.....");
}
}
实际上,显然还有JAVA启动的过程,JVM的C语言实现部分有 JNI_OnLoad()