while循环引起cpu爆满问题
-
场景
-
当我们使用while循环做一些业务时可能会出现死循环
-
当业务需要用死循环来实现监听的时候或则其他业务
-
当我们需要一直使用循环业务的时候
-
-
问题
产生死循环使程序cpu频率相当高导致卡死
-
描述
例子:做一个一直数数的业务(开启20个线程数数)
代码
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; public class Test { public static void main(String[] args) { //定义线程池 ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2 + 1); //保证数据原子性 AtomicInteger i = new AtomicInteger(); for (int k = 0;k<20;k++){ //开启20个线程 executorService.execute(()->{ while(true){ //线程一直读数 System.out.println(Thread.currentThread().getName()+"-报数:"+ i.getAndIncrement()); } }); } } }
查看cpu的使用情况可以看到非常的高
-
改进
- 代码(加一个休眠的代码)
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; public class Test { public static void main(String[] args) { //定义线程池 ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2 + 1); //保证数据原子性 AtomicInteger i = new AtomicInteger(); for (int k = 0;k<20;k++){ //开启20个线程 executorService.execute(()->{ while(true){ //线程一直读数 //让线程休眠 try { Thread.sleep(12); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"-报数:"+ i.getAndIncrement()); } }); } } }
查看cpu的使用情况