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");  }  }  
}

这个程序将一直输出"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");  }  }  
}

 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"); // 主线程执行完毕,守护线程将继续运行  }  
}

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


三、总结

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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/181274.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode [中等]128. 最长连续序列

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 128. 最长连续序列 - 力扣(LeetCode) 思路: 利…

大数据学习(26)-数据倾斜总结

&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦&#x1f91…

第五届全国高校计算机能力挑战赛-程序设计挑战赛(C语言模拟题)

1、已有定义“int a[10]{1,2},i0;”,下面语句中与“ a[i]a[i1],i;”等价的是()。 A. a[i]a[i1]; B. a[i]a[i]; C. a[i]a[i1]; D. i,a[i-1]a[i]; 2、两次运行下面的程序,如果从键盘上分别输入6和4,则输出结果是()。 A. 7和5 …

3D打印报价系统

一款3d打印报价系统不仅可以展示三维模型,还能自动计算模型的相关信息,如面积、体积和尺寸信息。 用户上传三维模型后,系统会自动为其生成一个报价页面。在这个页面上,用户可以看到他们模型的所有相关信息,包括面积、体…

常用的系统播放器——MediaPlayer生命周期

常用的系统播放器——MediaPlayer 状态图以及生命周期 Idle状态、End状态、Error状态 MediaPlayer创建实例或者调用reset()后就处于Idle状态,即就绪。 任意时刻调用release()就会进入End 当运行过程中出错&#xf…

鼎捷副总裁谢丽霞:从四大趋势来看,数智时代企业如何加速研发创新

目录 导读 01 研发创新 势不可挡 ① 从逆向设计走向正向设计 ② 从专业协助走向全面协同 ③ 从单点场景走向业务闭环 ④ 从知识管理走向知识工程 02 鼎捷雅典娜 数智驱动企业新未来 03 鼎捷PLM 赋能企业研发创新 导读 研发,企业长青的必备源动能。如何在…

孩子写作业用的护眼灯哪种好?适合考研的护眼台灯推荐

随着现在小孩子的近视率越来越高,全国中小学生近视比率占大多数,许多家长也开始为孩子的健康成长而担忧,这时很多家长就会选择护眼台灯来为孩子保驾护航。但面对市面上五花八门的台灯品牌,各式各样的台灯许多家长却乱了阵脚&#…

android viewpager 禁止滑动

android viewpager 禁止滑动 前言一、viewpager 禁止滑动是什么,有现成方法吗?二、使用setOnTouchListener三、使用自定义viewpager总结 前言 本文介绍了本人有一个相关的需求需要实现这一功能,在过程中发现自己之前没做过,然后记…

Linux-文件夹文件赋权、文件指定修改用户和用户组

Linux-文件夹文件赋权、文件指定修改用户和用户组 文件权限说明文件夹文件赋权chmod命令chmod示例以数字方式修改权限给指定目录赋权给当前目录的所有子文件夹和文件赋权 chown修改属主、属组 文件权限说明 文件或目录的权限位是由9个权限位来控制的,每三位一组&am…

服务器运行情况及线上排查问题常用命令

一、top命令 指令行: top返回: 返回分为两部分 (一)系统概览,见图知意 以下是几个需要注意的参数 1、load average: 系统负载,即任务队列的平均长度。三个数值分别为 1分钟、5分钟、15分…

MES系统数字化看板:生产过程透明化与优化

在当今的制造业中,实现生产过程的透明化和优化已成为企业持续发展的关键。MES系统(制造执行系统)作为实现这一目标的重要工具,其数字化看板功能在生产现场管理中发挥着越来越重要的作用。 一、MES系统的基本概念与功能 MES系统是…

分页实体类封装

请求实体 /*** author suran* description 分页实体* create 2023/11/29 9:31*/ public class PageQuery implements Serializable {private Integer pageNum 1;private Integer page 1;private Integer pageSize 20;public PageQuery() {}public static PageQuery of(int …

IP地址的最后一位不可以为0或255

说明 通常情况下,IP 地址的最后一位不能为 0 或 255。这是因为这些特定的 IP 地址有特殊用途。 IP 地址的最后一位为 0 通常用作网络地址,表示整个网络的起始地址。IP 地址的最后一位为 255 通常用作广播地址,用于将数据包发送到同一网络中…

Pod控制器简介,ReplicaSet、Deployment、HPA三种处理无状态pod应用的控制器介绍

目录 一.Pod控制器简介 二.ReplicaSet(简写rs) 1.简介 (1)主要功能 (2)rs较完整参数解释 2.创建和删除 (1)创建 (2)删除 3.扩容和缩容 &#xff08…

0基础学习VR全景平台篇第124篇:VR视频地拍补地 - PR软件教程

上课!全体起立~ 大家好,欢迎观看蛙色官方系列全景摄影课程! 嗨,大家好,今天我们来介绍【地拍VR视频补地】。 之前已经教给了大家如何处理航拍图片的补天和航天视频的补天,肯定有很多小伙伴也在好奇&…

三大录屏软件推荐,让你轻松录制屏幕

录屏软件的应用变得越来越广泛,无论是记录屏幕上的内容以方便日后查阅,还是与他人分享操作过程,录屏软件都发挥着重要作用。然而,市面上的录屏软件种类繁多,质量参差不齐。那有没有好用的录屏软件推荐呢?在…

吃火锅(Python)

题目描述 吃火锅 以上图片来自微信朋友圈:这种天气你有什么破事打电话给我基本没用。但是如果你说“吃火锅”,那就厉害了,我们的故事就开始了。 本题要求你实现一个程序,自动检查你朋友给你发来的信息里有没有 chi1 huo3 guo1。…

第二证券:机构密集调研消费电子、半导体产业链

据上海证券报记者核算,近一个月来,共有41家消费电子类公司和92家半导体公司(核算标准:申万职业2021,下同)发布出资者调研纪要。其间,有的公司款待了16个批次估计超200家安排,更有公司…

【九】linux下部署frp客户端服务端实践(内网穿透)

linux下部署frp客户端服务端实践 简介: 今天有一个这样的需求,部署在公司内部局域网虚拟机上的服务需要在外网能够访问到,这不就是内网穿透的需求吗,之前通过路由器实现过,现在公司这块路由器不具备这个功能了&#x…

Vue3的reactive、ref、toRef、toRefs用法以及区别

在 Vue3 中,reactive, ref, toRef, toRefs 都是用于创建响应式数据的方法。它们之间的主要区别在于它们的使用方式和返回值类型。 reactive:用于将一个普通对象转换为响应式对象。当对象的属性发生变化时,视图会自动更新。 import { reacti…