JAVA多线程创建与退出过程

  • 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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值