java 创建一个线程_JAVA多线程创建与退出过程

本文详细探讨了Java线程的创建时机、退出机制,以及守护线程的角色。特别指出,Java主线程结束并不导致程序终止,除非有非守护线程存在。讲解了Java虚拟机启动流程和线程分类,并通过示例展示了如何查看和控制线程状态。
摘要由CSDN通过智能技术生成

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值