首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java程序内部Java run Main方法之后不会退出

是因为Java程序在执行完main方法后并不会立即退出,而是等待所有非守护线程结束后才会退出。

在Java中,每个程序都至少有一个线程,即主线程。当执行到main方法时,主线程会创建并启动其他线程,这些线程可以是守护线程或非守护线程。守护线程是为其他线程提供服务的线程,当所有非守护线程结束后,守护线程会自动退出。

当main方法执行完毕后,主线程并不会立即退出,而是等待所有非守护线程结束。如果程序中存在非守护线程,主线程会一直等待,直到所有非守护线程执行完毕或被强制终止。只有当所有非守护线程结束后,主线程才会退出,整个Java程序才会终止。

这种设计可以确保在多线程环境下,所有线程都能正常执行完毕,避免线程中断导致的数据不一致或资源泄漏等问题。

在实际应用中,Java程序内部Java run Main方法之后不会退出的场景很常见,比如服务器应用程序、后台任务等。在这些场景下,程序需要持续运行,处理请求或执行任务,直到满足某个条件才退出。

腾讯云提供了一系列与Java开发相关的产品和服务,包括云服务器、云数据库、云函数、云存储等。具体推荐的产品和产品介绍链接地址如下:

  1. 云服务器(CVM):提供弹性计算能力,支持自定义配置和管理,适用于部署Java应用程序。了解更多:https://cloud.tencent.com/product/cvm
  2. 云数据库MySQL版(CDB):提供高可用、可扩展的MySQL数据库服务,适用于存储Java应用程序的数据。了解更多:https://cloud.tencent.com/product/cdb_mysql
  3. 云函数(SCF):无服务器函数计算服务,支持Java语言,可用于编写和执行Java函数。了解更多:https://cloud.tencent.com/product/scf
  4. 云存储(COS):提供高可靠、低成本的对象存储服务,适用于存储Java应用程序的静态资源和文件。了解更多:https://cloud.tencent.com/product/cos

请注意,以上推荐的产品和链接仅供参考,具体选择和使用需根据实际需求进行评估和决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java程序main方法执行流程

Java程序main方法执行流程 当我们编写完java源代码程序后,经过javac编译后,执行java命令执行这个程序时,是怎么一步步的调用到我们程序中的main方法的呢?...java可执行程序是由C++编写的,它的内部会启动一个Java虚拟机实例。 虚拟机启动入口函数位于src/java.base/share/native/launcher/main.c。...// src/java.base/share/native/launcher/main.c // java程序启动入口主函数 JNIEXPORT int main(int argc, char **argv...在文章开头说过,launcher/main.c中的main函数是java程序的启动函数,在main函数中调用了JLI_Launcher函数,在JLI_Launcher会调用LoadJavaVM函数加载虚拟机的动态链接库...当初始化工作完成后,会调用java应用程序的入口方法(static void main(String[] args)),然后根据main方法的类型从_entry_table数组中找出对应的解释器入口点,

1.2K30
  • Java线程与内核线程

    我们是使用strace -ff -o out java Example命令运行的程序,因此它会打印系统调用相关的信息. 707内核线程打印了Thread-A, 也就是说,内核线程707对应Java的...创建完成之后, 子线程执行java_start方法,而父线程暂时阻塞住. 子线程唤醒父线程,然后子线程阻塞住. 父线程被唤醒之后,执行start方法....父线程唤醒之前阻塞的子线程 子线程被唤醒之后,执行JVM中线程的run方法 最后子线程会调用执行Java线程的run方法....同时当Java线程的run方法执行完成之后, 线程就调用exit退出了. 这里也就解释了Java线程退出之后,内核线程也会退出的原因了....以上也只是分析了一个普通的线程退出之后,内核线程也自然退出了. 难道main线程也是这样的吗? main线程是第一个线程吗? 我们后面再单独说下main线程的情况.

    1.1K40

    彻底理解Java并发:Java线程

    Java虚拟机会为其创建方法调用栈和程序计数器,等待调度运行。 3、运行状态(RUNNING) 如果处于就绪状态的线程获得了 CPU,开始执行 run() 方法的线程执行体,则该线程处于运行状态。...4、线程中断(interrupt) 中断一个线程,其本意是给这个线程一个通知信号,会影响这个线程内部的一个中断标识位。这个线程本身并不会因此而改变状态(如阻塞,终止等)。...调用interrupt()方法不会中断一个正在运行的线程。也就是说处于 Running 状态的线程并不会因为被中断而被终止,仅仅改变了内部维护的中断标识位而已。...比如,你想终止一个线程thread的时候,可以调用thread.interrupt()方法,在线程的run方法内部可以根据hread.isInterrupted()的值来优雅的终止线程。...当 JVM 中所有的线程都是守护线程的时候,JVM 就可以退出了;如果还有一个或以上的非守护线程则 JVM 不会退出

    52610

    java高并发系列 - 第11天:线程中断的几种方式

    方法中有个死循环,内部通过exit变量的值来控制是否退出。...程序有个重点:volatile关键字,exit变量必须通过这个修饰,如果把这个去掉,程序无法正常退出。...线程内部有个中断标志,当调用线程的interrupt()实例方法之后,线程的中断标志会被置为true,可以通过线程的实例方法isInterrupted()获取线程的中断标志。...(Demo3.java:17) 程序可以正常结束了,分析一下上面代码,注意几点: main方法中调用了t.interrupt()方法,此时线程t内部的中断标志会置为true 然后会触发run()方法内部的...中又调用了this.interrupt();一次,将中断标志置为false run()方法中通过this.isInterrupted()来获取线程的中断标志,退出循环(break) 总结 当一个线程处于被阻塞状态或者试图执行一个阻塞操作时

    53340

    java高并发系列 - 第9天:用户线程和守护线程

    程序只有守护线程时,系统会自动退出 package com.itsoku.chat03; /** * 微信公众号:路人甲Java,专注于java技术分享(带你玩转 爬虫、分布式事务、异步消息服务、任务调度...可以看到主线程已经结束了,但是程序无法退出,原因:子线程1是用户线程,内部有个死循环,一直处于运行状态,无法结束。...程序可以正常结束了,代码中通过 t1.setDaemon(true); 将t1线程设置为守护线程,main方法所在的主线程执行完毕之后程序退出了。...结论:当程序中所有的用户线程执行完毕之后,不管守护线程是否结束,系统都会自动退出。...总结 java中的线程分为用户线程和守护线程 程序中的所有的用户线程结束之后,不管守护线程处于什么状态,java虚拟机都会自动退出 调用线程的实例方法setDaemon()来设置线程是否是守护线程 setDaemon

    66820

    Handler源码和9个常见问题的解答,这些你都掌握了吗?

    31) at java.lang.Thread.run(Thread.java:919) 添加Looper.prepare()创建Looper,同时调用Looper.loop()方法开始处理消息...简单做法就是可执行代码是能一直执行下去的,死循环便能保证不会退出,例如,binder 线程也是采用死循环的方法,通过循环方式不同与 Binder 驱动进行读写操作,当然并非简单地死循环,无消息时会休眠...所以说,主线程大多数时候都是处于休眠状态,并不会消耗大量CPU资源。 主线程的Looper何时退出 在App退出时,ActivityThread中的mH(Handler)收到消息后,执行退出。...$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java...:930) 为什么不允许退出呢,因为主线程不允许退出,一旦退出就意味着程序挂了,退出也不应该用这种方式退出

    1.3K00

    Java并发之线程中断

    在我们的程序中经常会有一些不达到目的不会退出的线程,例如:我们有一个下载程序线程,该线程在没有下载成功之前是不会退出的,若此时用户觉得下载速度慢,不想下载了,这时就需要用到我们的线程中断机制了,告诉线程...,你不要继续执行了,准备好退出吧。...这两个状态下调用中断方法来中断线程的时候,Java认为毫无意义,所以并不会设置线程的中断标识位,什么事也不会发生。...这里其实Java将这种权力交给了我们的程序Java给我们提供了一个中断标志位,我们的程序可以通过if判断中断标志位是否被设置来中断我们的程序而不是系统强制的中断。...(){ doSomething(); } } 这里我们自定义了一个线程类,run方法中主要就做一件事情,调用一个有锁的静态方法,该方法内部是一个死循环(占用该锁让其他线程阻塞)。

    1.1K90

    每日一博 - 闲聊 Java 中的中断

    简单来说,我们可以通过调用线程的 interrupt() 方法来中断某个线程。中断处于运行状态的线程并不会对它造成影响,中断线程仅仅是把被中断的线程的标志设置为了 true。...(ReentrantLock.java:335) at org.example.InterruptLockDemo$1.run(InterruptLockDemo.java:18) at java.lang.Thread.run...:457) at org.example.InterruptLockDemo$1.run(InterruptLockDemo.java:25) at java.lang.Thread.run(Thread.java...所以,中断处于运行状态的线程时,我们可以在被中断的线程内部判断当前线程的中断标识位是否被设置了,如果被设置了,就退出代码的执行,然后被中断的线程也就可以优雅地退出执行了。...---- JDK 的线程池 ThreadPoolExecutor 内部是如何运用中断实现功能的 我们使用 ThreadPoolExecutor,在程序运行结束时,我们会调用它的 shutdown() 方法来关闭线程池

    16030

    想实现安卓队列功能?Handler内功心法,你值得拥有!——Handler源码和常见问题的解答

    31) at java.lang.Thread.run(Thread.java:919) 添加Looper.prepare()创建Looper,同时调用Looper.loop()方法开始处理消息...简单做法就是可执行代码是能一直执行下去的,死循环便能保证不会退出,例如,binder 线程也是采用死循环的方法,通过循环方式不同与 Binder 驱动进行读写操作,当然并非简单地死循环,无消息时会休眠...所以说,主线程大多数时候都是处于休眠状态,并不会消耗大量CPU资源。 主线程的Looper何时退出 在App退出时,ActivityThread中的mH(Handler)收到消息后,执行退出。...$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java...:930) 为什么不允许退出呢,因为主线程不允许退出,一旦退出就意味着程序挂了,退出也不应该用这种方式退出

    2K20

    Java 多线程 Thread 和 Runnable

    ()和start()方法的关系 Thread被构造为New状态,事实上threadStatus 内部属性为0 不能两次启动Thread,否则就会出现IllegalThreadStateException...简而言之: Thread负责线程本身的职责控制, Runnable负责逻辑单元执行 Thread API 任何一个线程都是由另一个线程创建的,main线程由JVM创建的,程序里面的父线程都是main线程...,stackSize 越大代表线程的递归深度越深,stackSize越小创建线程的数量越多 java虚拟机栈和程序计数器都是线程私有的,生命周期和线程相同 堆内存是被所有线程共享的内存区域....如果优先级大于组的优先级,那么指定的优先级则会失效,则是组的最大优先级. main 的优先级是5,它派生出来的程序的优先级都是5 4....线程最好的退出方式捕获中断异常进行退出, t.interrupt(); 如果在线程中执行某个可中断方法,则可以通过捕获中断信号来决定是否退出. 即在catch中决定是否退出 8.

    51710

    Handler的初级、中级、高级问法,你都掌握了吗?

    31) at java.lang.Thread.run(Thread.java:919) 添加Looper.prepare()创建Looper,同时调用Looper.loop()方法开始处理消息...简单做法就是可执行代码是能一直执行下去的,死循环便能保证不会退出,例如,binder 线程也是采用死循环的方法,通过循环方式不同与 Binder 驱动进行读写操作,当然并非简单地死循环,无消息时会休眠...所以说,主线程大多数时候都是处于休眠状态,并不会消耗大量CPU资源。 主线程的Looper何时退出 在App退出时,ActivityThread中的mH(Handler)收到消息后,执行退出。...$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java...:930) 为什么不允许退出呢,因为主线程不允许退出,一旦退出就意味着程序挂了,退出也不应该用这种方式退出

    1.1K40

    Thread介绍

    + Thread.currentThread().getState()); } } 执行结果: 构造方法的状态:RUNNABLE 线程在Main方法中的状态1:NEW run方法中的状态:RUNNABLE...线程在Main方法中的状态2:TERMINATED 创建线程 创建线程只有一种方式那就是构造Thread类,而实现线程的执行单元有两种方式: 第一种是重新Thread的run方法 第二种是实现Runnable...特殊就特殊在如果程序中所有的用户线程都退出了,那么所有的守护线程就都会被杀死,很好理解,没有被守护的对象了,也不需要守护线程了。...因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序不会终止。...如果将thread.setDaemon(true)注释放开,则当main线程执行完毕之后,JVM也随之退出,当然thread也就退出了。

    67451

    面试5年25K程序员回答不出来为什么Javamain方法必须是public static void?

    p=5107 最近接连不断面试了不少中高级程序员,我问到“为什么 Javamain 方法必须是 public static void?”几乎没人能回答出来。...当然,很多人首先学的是 C 和 C++,但是在 Javamain 方法与前者有些细微的不同,它不会返回任何值,为什么 main 方式是 public、static、void,这篇文章尝试去找到一些答案...Main 方法Java 程序的入口,记住,我们这里不会讨论 Servlet、MIDlet 和其他任何容器管理的 java 程序,在 java 核心编程中,JVM 会查找类中的 public static...因为 main 返回任何值对程序都没任何意义,所以设计成 void,意味着 main 不会有任何值返回。...3.main 方式是程序的入口,程序执行的开始处。 4.main 方法被一个特定的线程 ”main” 运行,程序会一直运行直到 main 线程结束或者 non-daemon 线程终止。

    45830

    Java基础——异常体系

    Error错误:描述了Java运行时系统的内部错误和资源耗尽错误。一般是指虚拟机相关的问题,如系统崩溃,虚拟机出错误等,这种错误无法恢复或不可能捕获,将导致应用程序中断,通常不处理。...因为如果出现这样的内部错误,除了通告用户,并尽力使程序安全地终止之外,再也无能为力了。...如果没有处理块,到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。...如果在其它场景,遇到了一些错误,如果退出程序比较好,这时你就可以不太理会运行时异常,或者是通过对异常的处理显式的控制程序退出Java异常处理方法有:抛出异常,捕捉异常。...只有finally块执行完成之后,才会回来执行try或者catch块中的return或throw语句,如果finally中使用了return或者 throw等终止方法的语句,则就不会跳回执行,直接停止。

    69270

    多线程基础知识(全面):创建线程、线程状态如何变化、wait()、notify()、sleep()、停止线程

    ;而Runnable接口的run()方法的异常只能在内部消化,不能继续上抛在启动线程的时候,可以使用run方法吗?...sleep() 是让程序暂停执行指定的时间并让出CPU给其它线程,当时间到了又会自动恢复运行状态;而wait()只有被唤醒之后,线程才会重新尝试获取锁,获取到了锁才能继续执行。...有四种方式可以停止线程run()方法运行完毕,线程自动结束使用退出标志,使线程正常退出,也就是当run方法完成后线程终止使用stop方法强行终止(不推荐,因为stop和suspend、resume一样,...但有时我们需要创建一些长时间运行的线程、run方法是永远不会结束的,如在服务端程序中使用线程监听客户端请求、数据入库线程、或者其他需要循环处理的任务。...方法没有返回值Callable接口call方法有返回值,需要FutureTask获取结果Callable接口的call()方法允许抛出异常;而Runnable接口的run()方法的异常只能在内部消化,不能继续上抛

    19910

    java 程序驻留不退出保持运行

    前言 不管是C、java、go 程序,要让程序一直不间断动行,就肯定需要保持线程不退出,才能可能持续运行。...今天说的是java,一般来说从main方法开始运行结束之后,线程也就退出,如何保证线程不退出? 实际上只要证保有一个线程在持续运行,程序就不算退出。...一般来说只需要保持main线程不退出,然后其他线程不间断的工作就OK。 实际上在如果开启多个线程,就算主线程执行结束了,子线程没有结整,JVM一样不会退出。...) 这几种方式,不是阻塞,就是睡眠,大概思路都差不多,就是 读取流 通过阻塞主线程,来验证一下,运行后就可以看到service的run方法执行完后,程序不会退的。...这种方式是相当的不推荐,那有没有办法,让程序可以在该阻塞的时候阻塞,该退出的时候退出,其实只能说方法还是有很多。再举个例子。

    1.2K40

    Android高级面试问题及答案(1)——Android Framework篇

    虚拟机 2)注册jni函数,这样就可以调用java方法 3)通过jni调用com.android.internal.os.ZygoteInit的main方法,ZygoteIni是java类,此时Zygote...的世界,调用ZygoteInit.javamain方法 jclass startClass = env->FindClass(slashClassName); .........加快应用进程启动速度 3)forkSystemServer fork出system_server子进程 4)zygoteServer.runSelectLoop()在zygote进程中无限循环,使得zygote不会退出...方法 3.SystemServer.javamain中创建SystemServiceManager类(对系统的服务进行创建、启动和生命周期管理),创建系统context,启动各种服务(引导服务,核心服务..., InnerConnection 的 connected 方法 内部会调用 H 的 post 方法 向主线程发送消息,并且解决 当前应用程序进程与 Service 跨进程通信的问题 AppBindRecord

    3K21

    守护线程和非守护线程_java守护线程的作用

    当VM检测仅剩一个守护线程,而用户线程都已经退出运行时,VM就会退出,因为没有如果没有了被守护这,也就没有继续运行程序的必要了。如果有非守护线程仍然存活,VM就不会退出。...守护线程并非只有虚拟机内部提供,用户在编写程序时也可以自己设置守护线程。用户可以用Thread的setDaemon(true)方法设置当前线程为守护线程。...虽然守护线程可能非常有用,但必须小心确保其他所有非守护线程消亡时,不会由于它的终止而产生任何危害。因为你不可能知道在所有的用户线程退出运行前,守护线程是否已经完成了预期的服务任务。...除 JVM 内部的守护线程外,用户可以通过以下方法设置守护线程: public final void setDaemon(boolean on) 可以通过以下方法查询线程是否为守护线程: public..." java.lang.IllegalThreadStateException at java.lang.Thread.setDaemon(Thread.java:1359) at day003.TestDaemon.main

    55110
    领券