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

Java:在线程中`while(true){...}`循环不好吗?有什么选择?

在Java编程中,while(true)循环是非常常见的一种写法,用于实现不断地执行某个代码块。但是,这种循环也存在一些缺点,比如占用更多的内存、执行时间较长等。因此,在Java开发中,我们需要根据具体情况进行选择。

首先,我们需要了解while(true)循环的原理。在Java中,while(true)循环是一种条件循环,即当条件为真时,循环体中的代码才会被执行。因此,当我们在循环体中执行某些操作时,如果这些操作不会改变循环条件,那么循环将会一直执行下去,直到程序被强制终止。

那么,我们应该如何选择while(true)循环呢?

  1. 如果循环体中的代码可以有效地改变循环条件,那么使用while(true)循环是合适的。因为只有当循环条件为真时,循环体中的代码才会被执行,这样可以有效地避免重复执行相同的代码。
  2. 如果循环体中的代码仅仅是一些简单的操作,比如声明变量、打印语句等,那么使用while(true)循环可能会造成不必要的资源浪费。因为Java是一种面向对象的语言,所以我们应该尽量使用对象来完成任务,而不是使用简单的循环。
  3. 如果循环体中的代码比较复杂,比如涉及多个条件判断、循环嵌套等,那么可以考虑使用for(int i=0;i<10;i++)循环或者其他更高级的循环方式。因为这些循环方式可以更好地控制循环次数,避免重复执行相同的代码。

综上所述,while(true)循环适用于条件不变的循环,而for循环和其他高级循环方式适用于条件变化的循环。在实际开发中,我们需要根据具体情况选择合适的循环方式,并尽量使用更高级的编程方式,以更好地提高程序的性能和可维护性。

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

相关·内容

Java 什么推荐 while 循环中使用 sleep()

前言最近逛 CSDN 看到一篇文章,文章大意是说为什么循环推荐使用 sleep 操作,原因在于线程挂起和唤醒会有很大的性能消耗,并推荐使用 Timer 及 ScheduledExecutorService...sleep 可能会导致忙等待 // 如 FLAG 变量状态未改变 那么线程可能一直循环,并不断进行线程挂起和唤醒原因是否正确主要原因和原文博主所说很大的关系但不完全正确:我们都知道 Java 线程实际对应着操作系统的一个线程...比如微服务体系,客户端上报实例状态,或者服务端检测客户端状态都会使用定时轮询的机制。... Java AQS 等待获取锁和线程池任务为空等待新任务时,会使用等待和唤醒操作轮询机制 和 等待和唤醒 一般会结合使用,避免线程频繁的挂起和唤醒。...我的博客上,你将找到关于Java核心概念、JVM 底层技术、常用框架如Spring和Mybatis 、MySQL等数据库管理、RabbitMQ、Rocketmq等消息中间件、性能优化等内容的深入文章。

72830

什么线程组,为什么 Java 推荐使用?

线程,如果发生未捕获异常,可以通过 Thread.UncaughtExceptionHandler 进行处理。 Java ,虽然线程组是一种功能强大的机制,但实际上并不推荐使用。...下面主要从以下几个方面说明: 1、难以扩展 平常的开发,当我们需要对线程进行动态调度时,线程组往往过于笨重,这导致了代码难以扩展。...3、容易引起歧义 Java ,虽然 ThreadGroup 的设计旨在通过将一组线程分到同一个容器来轻松管理和控制它们,但如果使用错误,可能会导致线程状态。...因此, Java 线程组已基本过时,推荐使用 Executor 框架等新的更实用的工具来进行线程管理。... JDK8之后,API也推出了更加强大的CompletionService接口,它能够执行更为复杂的异步任务并得到结果,这极大地扩展了Java线程编程的功能性。

25920

一个困扰我122天的技术问题,我好像知道答案了。

线程一直循环,直到 flag 变为 true。 而 flag 什么时候变为 true 呢? 从程序里看起来是线程休眠 100ms 后,把 flag 修改为 true。...但凡是对 Java 并发编程一定基础的朋友都能看出来,这个程序是一个死循环。导致死循环的原因是 flag 变量不是被 volatile 修饰的,所以子线程对 flag 的修改不一定能被主线程看到。...由于变量 flag 没有被 volatile 修饰,而且线程休眠的 100ms while 循环的 flag 一直为 false,循环到一定次数后,触发了 jvm 的即时编译功能,进行循环表达式外提...(所以同步操作) 因此,如果使用 System.out.println, JVM 将无法循环期间缓存变量。 这就是为什么,当 print 语句时,循环可以正常结束,尽管这不是一个正确的操作。...操作程序的第 23 行,个 lock 前缀。而这个 lock 指令,就相当于一个内存屏障。会触发 Java 内存模式的“store”和“write”操作。

90410

聊聊贯穿Java并发编程的中断机制

程序怎样演绎这个心情就看具体的业务逻辑了,Java 的中断机制就是这么简单 如果还没改变这个先入为主的概念,我怀你没有女朋友(?)我们拥抱一下 为什么会有中断机制?...线程的场景,有的线程可能迷失怪圈无法自拔(自旋浪费资源),这时就可以用其他线程恰当的时机给它个中断通知,被“中断”的线程可以选择恰当的时机选择跳出怪圈,最大化的利用资源 那程序如何中断?... Java 线程被中断的反应是不一样的,脾气不好的直接就抛出了 InterruptedException() , ?...中断机制的使用场景 通常,中断的使用场景以下几个 点击某个桌面应用的关闭按钮时(比如你关闭 IDEA,不保存数据直接中断好吗?)...再通过个例子来加深一下理解: 本意是当前线程被中断之后,退出while(true), 你觉得代码问题吗?

59020

「通信框架Netty4 源码解读(一)」起步,关于IO的简单总结,模拟一个redis客户端

但是实际上线程等待水壶烧开的时间段什么都没有做。 NIO (New I/O):同时支持阻塞与非阻塞模式,但这里我们以其同步非阻塞I/O模式来说明,那么什么叫做同步非阻塞?...IO与NIO区别: IO面向流,NIO面向缓冲区 IO的各种流是阻塞的,NIO是非阻塞模式 Java NIO的选择允许一个单独的线程来监视多个输入通道,可以注册多个通道使用一个选择器,然后使用一个单独的线程来...“选择”通道:这些通道里已经可以处理的输入或选择已准备写入的通道。...,主线程继续循环等待客户端的链接?...如果,10000个人来链接,那服务器就要开10000个线程,如果10万呢?你开10万个线程?哇,你服务器性能好高耶!线程的创建与销毁很耗资源的好吗

41730

Java并发编程的中断机制

程序怎样演绎这个心情就看具体的业务逻辑了,Java 的中断机制就是这么简单 如果还没改变这个先入为主的概念,我怀你没有女朋友()我们拥抱一下 为什么会有中断机制?...线程的场景,有的线程可能迷失怪圈无法自拔(自旋浪费资源),这时就可以用其他线程恰当的时机给它个中断通知,被“中断”的线程可以选择恰当的时机选择跳出怪圈,最大化的利用资源 那程序如何中断?...中断机制的使用场景 通常,中断的使用场景以下几个 点击某个桌面应用的关闭按钮时(比如你关闭 IDEA,不保存数据直接中断好吗?)...再通过个例子来加深一下理解: 本意是当前线程被中断之后,退出while(true), 你觉得代码问题吗?...true,它将会在正在运行异步任务的线程上调用 interrupt 方法,如果正在执行的异步任务的代码没有对中断做出响应,那么 cancel 方法的参数将不会起到什么效果 总结 到这里你应该理解Java

53130

Java并发编程的艺术(五)——中断

什么是中断? Java没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的机制——中断。...每个线程对象中都有一个标识,用于表示线程是否被中断;该标识位为true表示中断,为false表示未中断; 通过调用线程对象的interrupt方法将该线程的标识位设为true;可以别的线程调用,也可以自己的线程调用...suspend() 暂停调用者线程,只释放CPU执行权,释放锁。 由于释放资源的情况下进入睡眠状态,容易产生死锁。因此已过时! resume() 恢复调用者线程,让他处于就绪状态。...触发中断 t1.interrupt(); 上述代码执行后会将t1对象的中断状态设为true,此时t1线程的正常任务代码执行完成后,进入下一次while循环前Thread.currentThread.isInterrupted...当你某一条线程调用这些方法时,这个方法可能会被阻塞很长时间,你可以别的线程调用当前线程对象的interrupt方法触发这些函数抛出InterruptedException异常。

1.2K70

通过实现生产者、消费者案例再次实践Java线程

线程通信,线程系统,不同的线程执行不同的任务;如果这些任务之间存在联系,那么执行这些任务的线程之间就必须能够通信,共同协调完成系统任务。 ?...生产者、消费者案例 在这个案例,为什么设计成生产者直接与给消费者交互?让两者直接交换数据不是更好吗?...选择先把数据存储到共享资源,然后消费者再从共享资源取出数据使用,中间多了一个环节不是更麻烦了?...案例问题的解决 本案例需要解决的问题两个,分别如下: 问题一:蔬菜名称和数量匹配的问题。 问题二:需要保证超市无货时生产,超市有货时才消费。...详情可查看我的另外一篇关于多线程的文章:「JAVAJava 线程不安全分析,同步锁和Lock机制,哪个解决方案更好 同步代码块的同步锁必须选择多个线程共同的资源对象,当前生产者线程在生产数据的时候

46850

通过实现生产者、消费者案例再次实践Java线程

线程通信,线程系统,不同的线程执行不同的任务;如果这些任务之间存在联系,那么执行这些任务的线程之间就必须能够通信,共同协调完成系统任务。...、消费者之间的交互流程如下: 在这个案例,为什么设计成生产者直接与给消费者交互?...让两者直接交换数据不是更好吗选择先把数据存储到共享资源,然后消费者再从共享资源取出数据使用,中间多了一个环节不是更麻烦了?...案例问题的解决 本案例需要解决的问题两个,分别如下: 问题一:蔬菜名称和数量匹配的问题。 问题二:需要保证超市无货时生产,超市有货时才消费。...详情可查看我的另外一篇关于多线程的文章:Java 线程不安全分析,同步锁和Lock机制,哪个解决方案更好 同步代码块的同步锁必须选择多个线程共同的资源对象,当前生产者线程在生产数据的时候(先拥有同步锁

95500

编写优雅代码的最佳实践

Robert Martin曾说过"代码阅读说脏话的频率是衡量代码质量额唯一标准"。同时,代码的写法应当使别人理解它所需的时间最小化,也就是说我们写的代码是给人看的而不是给机器看的。...,但是了这行注释,我们就知道通过移位操作来提升性能。...推荐用begin和end来表示包含/排除范围 begin表示包含,end表示排除,Java典型的例子就是String.substring() String s = "Hello world";...公布可能的陷阱 void sendMail(String to,String subject,String body); 这个函数由于需要调用外部服务器发送邮件,可能会很耗时,可能导致使用者的线程挂起...减少控制流变量 while、for等循环语句中,我们通常使用自定义的bool变量,来控制流转。 boolean done = false; while(/* condition */ && !

1.6K200

刨根问底---一次 OOM 试验造成的电脑雪崩引发的思考

以上对问题的描述至少有三个问题值得我们去思考 以上 while (true) 为啥会造成 cpu 负载 800% 线程发生 OOM 后我终端用 Ctrl + C 试图终止 Java 进程的执行...,但没成功,为啥中止信号生效呢 主线程发生 OOM 后 Java 进程为啥不会停止运行 一个个来看 while (true) 与 cpu 负载的关系 首先我们要明白 %CPU 代表的含义,它指的是进程占用一个核的百分比...线程执行完系统分配的时间片后确实是会让出 CPU 的执行权,但别的进程会告诉系统自己没什么事情要做,不需要那么多的时间,这个时候系统就会切换到下一个进程,直到回到这个死循环的进程上,而 Java...进程无论什么时候都再循环,都会一直会报告有事情要做,系统就会把尽可能多的时间分给它(正所谓会哭的小孩奶吃),系统会不断调高 while(true) 线程的优先级,提升它的 CPU 占用时间片,也就是说...while(true) 这个死循环用光了别的进程省下的时间,不让 CPU 有片刻休息的时间,导致 CPU 负载过高,这就像马太效应,勤奋的线程执行的越努力,其他懒惰的线程就越会被缩短时间片,越得不到机会

51010

Java】一次 OOM 试验造成的电脑雪崩引发的思考

以上对问题的描述至少有三个问题值得我们去思考 以上 while (true) 为啥会造成 cpu 负载 800% 线程发生 OOM 后我终端用 Ctrl + C 试图终止 Java 进程的执行...,但没成功,为啥中止信号生效呢 主线程发生 OOM 后 Java 进程为啥不会停止运行 一个个来看 while (true) 与 cpu 负载的关系 首先我们要明白 %CPU 代表的含义,它指的是进程占用一个核的百分比...线程执行完系统分配的时间片后确实是会让出 CPU 的执行权,但别的进程会告诉系统自己没什么事情要做,不需要那么多的时间,这个时候系统就会切换到下一个进程,直到回到这个死循环的进程上,而 Java...进程无论什么时候都再循环,都会一直会报告有事情要做,系统就会把尽可能多的时间分给它(正所谓会哭的小孩奶吃),系统会不断调高 while(true) 线程的优先级,提升它的 CPU 占用时间片,也就是说...while(true) 这个死循环用光了别的进程省下的时间,不让 CPU 有片刻休息的时间,导致 CPU 负载过高,这就像马太效应,勤奋的线程执行的越努力,其他懒惰的线程就越会被缩短时间片,越得不到机会

52330

反制面试官 | 14张原理图 | 再也不怕被问 volatile!

这是一份精心总结的Java内存模型思维导图,拿去谢。 ? ? 3.1 为什么需要Java内存模型?...3.2 到底什么Java内存模型? 1.定义程序各种变量的访问规则 2.把变量值存储到内存的底层细节 3.从内存取出变量值的底层细节 3.3 Java内存模型的两大内存是啥? ?...Java内存模型的几个规范: 1.所有变量存储主内存 2.主内存是虚拟机内存的一部分 3.每条线程自己的工作内存 4.线程的工作内存保存变量的主内存副本 5.线程对变量的操作必须在工作内存中进行...").start(); while(myData.number == 0) { // main线程就一直在这里等待循环,直到number的值不等于零...否则,当asleep被另一个线程修改时,执行判断的线程却发现不了。 那为什么我们直接用synchorized,lock锁?它们既可以保证可见性,又可以保证原子性为何不用呢?

33121

《七周七并发模型》阅读笔记(一)一、线程与锁——第一天二、线程与锁——第二天三、线程与锁——第三天

公平锁的性能不如非公平锁——公平的获取锁没有考虑到操作系统对线程的调度因素,这样造成JVM对于等待线程调度次序和操作系统对线程的调度之间的匹配;另一方面,公平锁可以防止“饥饿”情况的产生,以TPS...ReentrantReadWriteLock的中文名称是读写锁,线程场景,如果没有写线程操作模板对象,读写锁允许多个读线程同时读。...; myMonitorObject.notify(); } } } (3)为了防止假唤醒,保存信号的成员变量将在一个while循环里接受检查,而不是if表达式里。...被唤醒的线程会自旋直到自旋锁(while循环)里的条件变为false。...它与AtomicInteger什么区别?适用于什么场景?

63120

你对Java网络编程了解的如何?Java NIO 网络编程 | Netty前期知识(二)

其次线程本身占用较大内存的,Java线程线程栈所占用的内存在Java堆外,不受Java程序控制,只受系统资源限制(如若系统给资源不足,可能创建失败),默认一个线程线程栈大小是1M。...注意:对于非阻塞IO也有一个非常严重的问题,while循环中需要不断地去询问内核数据是否就绪,这样会导致CPU占用率非常高,因此一般情况下很少使用while循环方式来读取数据。...多路复用IO模型,会有一个线程不断去轮询多个socket的状态,只有当socket真正读写事件时,才会真正调用实际的IO读写操作。...---- 但是终究选择什么样的IO模型,还是需要根据实际问题实际分析的。 五、三大核心组件 | Buffer 基本介绍 Java NIO的Buffer用于和NIO通道进行交互。...你好,我是博主宁春,Java学习路上的一颗小小的种子,也希望一天能扎根长成苍天大树。 希望与君共勉 我们:待别时相见时,都已有所成。 本文是个人的学习笔记,夹杂着个人理解,如有不对,请啬赐教。

28820

(71) 显式锁 计算机程序的思维逻辑

Java并发包的显式锁接口和类位于包java.util.concurrent.locks下,主要接口和类: 锁接口Lock,主要实现类是ReentrantLock 读写锁接口ReadWriteLock...tryLock():只是尝试获取锁,立即返回,阻塞,如果获取成功,返回true,否则返回false。...,每个线程执行100次循环每次循环中,随机挑选两个账户进行转账。...这个检查是指,只有不存在其他等待时间更长的线程,它才会尝试获取锁。 这样保证公平不是很好吗?为什么默认不保证公平呢?...需要说明是,即使fair参数为true,ReentrantLock不带参数的tryLock方法也是不保证公平的,它不会检查是否其他等待时间更长的线程,其代码为: public boolean tryLock

59150

java并发编程(十二)待续......

46、Java interrupted 和 isInterrupted 方法什么区别?...如果线程被中断,则退出循环,否则执行一些操作,然后等待一段时间再继续执行。最后,我们线程调用 interrupt() 方法来中断线程。49、Java 的同步集合与并发集合什么区别?...54、Thread 类的 yield 方法什么作用?55、Java ConcurrentHashMap 的并发度是什么?56、Java Semaphore 是什么?...57、Java 线程池中 submit() 和 execute()方法什么区别? 58、什么是阻塞式方法?59、Java 的 ReadWriteLock 是什么?...70、如何确保线程安全?71、同步方法和同步块,哪个是更好的选择?72、如何创建守护线程?73、什么Java Timer 类?如何创建一个特定时间间隔的任务?

57020

java 线程interupt stop(dep)

但是代码因为使用了stop()强行停止线程,造成了数据的不同步。...其实方法很简单,只是需要我们执行确定线程什么时候退出就可以了。仍用本例来说,只需要在ChangeObjectThread线程增加一个stopMe()方法就可以了。...3、java线程的中断 中断可以理解为线程的一个标识位属性,它表示一个运行线程是否被其他线程进行了中断操作。...从Java的API可以看到,许多声明抛出InterruptedException的方法(例如Thread.sleep(longmillis)方法,当线程sleep()休眠时,如果被中断,这个异常就会产生...6、参考的书籍 Java高并发程序设计 Java并发编程的艺术 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,拥有所有权,承担相关法律责任。

54720

读了源码,发现 volatile 如此重要!

这是一份精心总结的Java内存模型思维导图,拿去谢。 原理图1-Java内存模型 3.1 为什么需要Java内存模型?...3.2 到底什么Java内存模型? 1.定义程序各种变量的访问规则 2.把变量值存储到内存的底层细节 3.从内存取出变量值的底层细节 3.3 Java内存模型的两大内存是啥?...Java内存模型的几个规范: 1.所有变量存储主内存 2.主内存是虚拟机内存的一部分 3.每条线程自己的工作内存 4.线程的工作内存保存变量的主内存副本 5.线程对变量的操作必须在工作内存中进行 6...").start(); while(myData.number == 0) { // main线程就一直在这里等待循环,直到number的值不等于零...否则,当asleep被另一个线程修改时,执行判断的线程却发现不了。 「那为什么我们直接用synchorized,lock锁?它们既可以保证可见性,又可以保证原子性为何不用呢?」

28230
领券