Java源码中经常出现的for (;;) {}:理解无限循环

简介: 我们平常都会去阅读Java的源码,经常可以在源码中看到for (;;) {}的结构,本文将带你去理解无限循环。虽然无限循环可以在某些情况下很有用,例如在需要一直监听用户输入或执行某些后台任务的情况下,但它们也可能会导致程序变得不可响应或崩溃。因此,在使用无限循环时需要谨慎,确保有适当的退出条件或逻辑,以避免程序陷入死循环。

 其他系列文章导航

Java基础合集

设计模式合集

多线程合集

分布式合集

ES合集


文章目录

其他系列文章导航

文章目录

前言

一、无限循环的原理

二、使用场景

2.1服务器端的消息监听:

2.2守护线程的执行:

三、总结


前言

我们平常都会去阅读Java的源码,经常可以在源码中看到for (;;) {}的结构,本文将带你去理解无限循环。


一、无限循环的原理

在Java编程语言中,for (;;) {}是一种特殊的循环结构,被称为无限循环。这种循环在开始时没有设置任何终止条件,因此它将无限次地执行其内部的代码块,直到程序被外部中断或终止。

在for (;;) {}循环中,第一个分号表示初始化语句的结束,第二个分号表示条件判断的结束,而第三个分号表示迭代语句的结束。由于没有条件判断和迭代语句,这个循环将一直执行下去,直到遇到break语句或程序终止。

值得注意的是:return终止不了。

下面是一个使用for (;;) {}的示例程序:

public class InfiniteLoopExample {  
    public static void main(String[] args) {  
        for (;;) {  
            System.out.println("This is an infinite loop");  
        }  
    }  
}

image.gif

这个程序将一直输出"This is an infinite loop",除非手动中断程序或使用break语句终止循环。在for (;;) {}循环中,代码块的执行将在下一次迭代开始时重新开始,因此输出将一直重复下去。


二、使用场景

这种写法通常用于需要持续运行或监听某些事件的场景,例如服务器端的消息监听、守护线程的执行等。在使用死循环时,需要谨慎处理循环体内部的逻辑,确保循环能够在适当的时候退出,避免陷入无限循环造成系统资源的浪费或程序无法正常终止。

2.1服务器端的消息监听:

以下是一个使用Java中for (;;) {}循环的服务器端消息监听的示例代码:

import java.io.*;  
import java.net.*;  
public class Server {  
    public static void main(String[] args) throws IOException {  
        ServerSocket serverSocket = new ServerSocket(8000);  
        System.out.println("Server started");  
        for (;;) {  
            Socket clientSocket = serverSocket.accept();  
            System.out.println("Client connected");  
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));  
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);  
            String message = in.readLine();  
            System.out.println("Received message: " + message);  
            // 在这里可以根据接收到的消息做出响应,例如:  
            // System.out.println("Hello, client!");  
            // 或者将消息存储到数据库中,或者触发其他一些操作。  
            clientSocket.close();  
            System.out.println("Client disconnected");  
        }  
    }  
}

image.gif

2.2守护线程的执行:

在Java中,守护线程(Daemon Thread)是在后台运行的线程,它不会阻止程序的执行,即使主线程已经结束,守护线程也会继续运行。守护线程通常用于执行一些后台任务,例如垃圾回收、资源管理等。

下面是一个使用for (;;) {}循环实现守护线程的示例代码:

public class DaemonThreadExample {  
    public static void main(String[] args) {  
        Thread daemonThread = new Thread(() -> {  
            for (;;) {  
                // 在这里执行守护线程的任务  
                System.out.println("Daemon thread is running");  
                try {  
                    Thread.sleep(1000); // 休眠1秒钟  
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                }  
            }  
        });  
        daemonThread.setDaemon(true); // 将线程设置为守护线程  
        daemonThread.start(); // 启动守护线程  
        System.out.println("Main thread is finished"); // 主线程执行完毕,守护线程将继续运行  
    }  
}

image.gif

在这个示例中,我们创建了一个Lambda表达式,表示守护线程要执行的任务。在for (;;) {}循环中,我们每隔1秒钟输出一条消息,表示守护线程正在运行。我们使用Thread.sleep()方法让守护线程休眠1秒钟,以节省CPU资源。最后,我们将守护线程设置为守护线程(setDaemon(true)),并启动它(start())。在主线程执行完毕后,守护线程将继续运行,输出每隔1秒钟一条的消息。


三、总结

虽然无限循环可以在某些情况下很有用,例如在需要一直监听用户输入或执行某些后台任务的情况下,但它们也可能会导致程序变得不可响应或崩溃。因此,在使用无限循环时需要谨慎,确保有适当的退出条件或逻辑,以避免程序陷入死循环。

目录
相关文章
|
5天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
16 2
|
1月前
|
Java Apache Maven
Java百项管理之新闻管理系统 熟悉java语法——大学生作业 有源码!!!可运行!!!
文章提供了使用Apache POI库在Java中创建和读取Excel文件的详细代码示例,包括写入数据到Excel和从Excel读取数据的方法。
59 6
Java百项管理之新闻管理系统 熟悉java语法——大学生作业 有源码!!!可运行!!!
|
2月前
|
数据采集 运维 前端开发
【Java】全套云HIS源码包含EMR、LIS (医院信息化建设)
系统技术特点:采用前后端分离架构,前端由Angular、JavaScript开发;后端使用Java语言开发。
81 5
|
8天前
|
Java 程序员 API
Java循环操作哪个快?
本文探讨了Java中Stream API与传统for循环的性能对比及适用场景。作者通过实际案例分析,指出在某些情况下,过度使用Stream API会导致代码可读性和维护性下降。测试结果显示,在数据量较小的情况下,普通for循环的性能优于Stream API,尤其是在涉及多次类似操作时。因此,建议在开发中根据具体需求选择合适的遍历方式,以提高代码的可读性和性能。
Java循环操作哪个快?
|
3月前
|
Kubernetes jenkins 持续交付
从代码到k8s部署应有尽有系列-java源码之String详解
本文详细介绍了一个基于 `gitlab + jenkins + harbor + k8s` 的自动化部署环境搭建流程。其中,`gitlab` 用于代码托管和 CI,`jenkins` 负责 CD 发布,`harbor` 作为镜像仓库,而 `k8s` 则用于运行服务。文章具体介绍了每项工具的部署步骤,并提供了详细的配置信息和示例代码。此外,还特别指出中间件(如 MySQL、Redis 等)应部署在 K8s 之外,以确保服务稳定性和独立性。通过本文,读者可以学习如何在本地环境中搭建一套完整的自动化部署系统。
69 0
|
9天前
|
人工智能 监控 数据可视化
Java智慧工地信息管理平台源码 智慧工地信息化解决方案SaaS源码 支持二次开发
智慧工地系统是依托物联网、互联网、AI、可视化建立的大数据管理平台,是一种全新的管理模式,能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实现全面高效的工程管理需求,满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效,为监管平台提供数据支撑。
25 3
|
14天前
|
运维 自然语言处理 供应链
Java云HIS医院管理系统源码 病案管理、医保业务、门诊、住院、电子病历编辑器
通过门诊的申请,或者直接住院登记,通过”护士工作站“分配患者,完成后,进入医生患者列表,医生对应开具”长期医嘱“和”临时医嘱“,并在电子病历中,记录病情。病人出院时,停止长期医嘱,开具出院医嘱。进入出院审核,审核医嘱与住院通过后,病人结清缴费,完成出院。
45 3
|
23天前
|
算法 Java 测试技术
🧑‍💻Java零基础:Java 的循环退出语句 break
【10月更文挑战第16天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
36 6
|
20天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
23天前
|
移动开发 前端开发 JavaScript
java家政系统成品源码的关键特点和技术应用
家政系统成品源码是已开发完成的家政服务管理软件,支持用户注册、登录、管理个人资料,家政人员信息管理,服务项目分类,订单与预约管理,支付集成,评价与反馈,地图定位等功能。适用于各种规模的家政服务公司,采用uniapp、SpringBoot、MySQL等技术栈,确保高效管理和优质用户体验。