JAVA多线程之当一个线程在执行死循环时会影响另外一个线程吗?

2023-11-15

一,问题描述

假设有两个线程在并发运行,一个线程执行的代码中含有一个死循环如:while(true)....当该线程在执行while(true)中代码时,另一个线程会有机会执行吗?

 

二,示例代码(代码来源于互联网)

 1 public class Service {
 2     Object object1 = new Object();
 3 
 4     public void methodA() {
 5         synchronized (object1) {
 6             System.out.println("methodA begin");
 7             boolean isContinueRun = true;
 8             //在这里执行一个死循环
 9             while (isContinueRun) {
10                 
11             }
12             System.out.println("methodA end");
13         }
14     }
15 
16     Object object2 = new Object();
17 
18     public void methodB() {
19         synchronized (object2) {
20             System.out.println("methodB begin");
21             System.out.println("methodB end");
22         }
23     }
24 }

 

两个线程类的实现如下:

 1 import service.Service;
 2 
 3 public class ThreadA extends Thread {
 4 
 5     private Service service;
 6 
 7     public ThreadA(Service service) {
 8         super();
 9         this.service = service;
10     }
11 
12     @Override
13     public void run() {
14         service.methodA();
15     }
16 
17 }

线程A执行methodA(),methodA()中有一个死循环

 

 1 import service.Service;
 2 
 3 public class ThreadB extends Thread {
 4 
 5     private Service service;
 6 
 7     public ThreadB(Service service) {
 8         super();
 9         this.service = service;
10     }
11 
12     @Override
13     public void run() {
14         service.methodB();
15     }
16 
17 }

线程B执行methodB(),当线程A进入methodA()中的while死循环时,线程B的能不能执行完成?

 

测试类

 1 import service.Service;
 2 import extthread.ThreadA;
 3 import extthread.ThreadB;
 4 
 5 public class Run {
 6 
 7     public static void main(String[] args) {
 8         Service service = new Service();
 9 
10         ThreadA athread = new ThreadA(service);
11         athread.start();
12 
13         ThreadB bthread = new ThreadB(service);
14         bthread.start();
15     }
16 
17 }

 

执行结果:

由于线程A和线程B获得的对象锁不是同一把锁,从结果中可以看出,线程B是可以执行完成的。而线程A由于进入了while死循环,故线程A一直执行运行下去了(整个程序未结束),但线程B会结束。

也就是说,尽管线程A一直在while中执行,需要占用CPU。但是,线程的调度是由JVM或者说是操作系统来负责的,并不是说线程A一直在while循环,然后线程B就占用不到CPU了。对于线程A而言,它就相当于一个“计算密集型”作业了。如果我们的while循环是不断地测试某个条件是否成立,那么这种方式就很浪费CPU,可参考一个具体的实例:JAVA多线程之线程间的通信方式 中的“线程间的通信方式”第二点while轮询。

 

如果把Service.java修改成如下:

 1 public class Service {
 2 //    Object object1 = new Object();
 3 
 4     public void methodA() {
 5         synchronized (this) {
 6             System.out.println("methodA begin");
 7             boolean isContinueRun = true;
 8             //在这里执行一个死循环
 9             while (isContinueRun) {
10                 
11             }
12             System.out.println("methodA end");
13         }
14     }
15 
16 //    Object object2 = new Object();
17 
18     public void methodB() {
19         synchronized (this) {
20             System.out.println("methodB begin");
21             System.out.println("methodB end");
22         }
23     }
24 }

若线程A先获得对象锁时,由于while循环,线程A一直在while空循环中。而线程B也因为无法获得锁而执行不了methodB()。

可以看出,如果在一个线程在synchronized方法中无法退出,无法将锁释放,另一个线程就只能无限等待了。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA多线程之当一个线程在执行死循环时会影响另外一个线程吗? 的相关文章

随机推荐

  • 由羽毛球拍想到的

    羽毛球拍 品牌太多 如何选择 看到红双喜厂商的具体套路 才知这个市场与手机市场一样 都是低端的外包 高端的自己做 但是 球拍这个东西高端的和低端的普通人能看出区别 许多生活中的产品都是如此 例如空调 格力之类的空调压缩机许多也是采购第三方的
  • Python之花舞盛宴:探索列表与元组之美与妙用

    前言 在Python编程世界中 列表和元组是两个最常用的数据结构之一 无论是初学者还是经验丰富的开发者 对于这两个数据类型的掌握都至关重要 列表和元组都是用于存储多个值的容器 但它们在性质和特性上有所不同 列表是可变的 可以随意修改 添加或
  • 用java有理数类包含加减乘除,7.1 面向对象的简介 - VimL 语言编程指北路

    面向对象是一种编程思想 并不特指某种编程语言 所以不必惊讶用 VimL 也能以面向 对象的方式来写代码 本章先简单介绍一下面向对象的编程思想 再探讨如何利用 VimL 现有的特性实现面向对象编程 最后应由用户自行决定是否有必要使用面向对象的
  • C++学习系列之求圆柱体的体积

    实例要求 以函数调用的方式 求圆柱体的体积 主函数中先输入圆柱体的半径和高 调用求体积的函数 输出结果 代码如下 include
  • linux服务器运维

    这本阿里P8撰写的算法笔记 再次推荐给大家 身边不少朋友学完这本书最后加入大厂 Github 疯传 史上最强悍 阿里大佬 LeetCode刷题手册 开放下载了 no space left on device 原因 磁盘满了 inode耗尽
  • 如何将Web主页性能提升十倍以上?

    给IT平头哥联盟加星标 提升前端技能 作者 exAspArk 译者 核子可乐 最近 我们将 Universe com 主页的性能提升了十倍以上 在本文中 我们将解析实现这一重大改进的具体技术手段 但在开始之前 让我们先对网络性能的重要意义进
  • C 基本语法

    原文链接 https www runoob com cprogramming c basic syntax html 我们已经看过 C 程序的基本结构 这将有助于我们理解 C 语言的其他基本的构建块 C 的令牌 Tokens C 程序由各种
  • Selenium+python之不打开浏览器,来运行测试用例

    调用浏览器 来进行自动化测试 是一个常规操作 或者说针对少量测试用例 可以打开浏览器运行 但是针对大量运行测试用例来说 如果每个测试用例都需要调用一次 浏览器 那么无疑对服务器增加了巨大的压力 那么有没有一个办法 不调用浏览器 让浏览器在后
  • (只需两步)让ChatGPT免费帮你制作出漂亮的PPT

    目录 第一步 生成 PPT 代码 第二步 将代码转化为 PPT 还在为制作PPT而烦恼吗 让ChatGPT来帮您 本篇文章介绍如何利用ChatGPT一键生成PPT文字和样式 省时省力又专业 真的只需两步 真的非常简单 以下部分生成效果 pp
  • bash和sh的区别

    一 简述 Shell 中文意思贝壳 寓意类似内核的壳 Shell是指一种应用程序 这个应用程序提供了一个界面 用户通过这个界面访问操作系统内核的服务 Shell 是一个用 C 语言编写的程序 它是用户使用 Linux 的桥梁 Shell 既
  • 一文搞懂Ubuntu环境变量

    用户级别的环境变量 bash profile bash login bashrc 坑的原理 1 当bash shell作为登录shell启动时 比如用户登录系统时 首先会查找并执行 bash profile文件 如果这个文件不存在 那么它会
  • R根据列名提取想要的列

    数据格式如下 a b c d e 1 2 3 4 5 使用select过滤不要的列 df which names df in c a b subset df select c a b 使用select选择想要的列 df c x y subs
  • 微信小程序 真机调试无法请求localhost

    问题描述 在微信开发者工具里能正常请求后台数据 但真机调试时 却报localhost请求失败的错误 解决方案 在客户端的config js中 把host里的localhost改成本机在局域网里的ip地址即可 服务端可继续沿用localhos
  • 【云原生】kubectl常用命令大全

    目录 一 资源管理方法 kubectl 的命令大全 二 kubectl常用命令大全 2 2 项目的生命周期 创建 gt 发布 gt 更新 gt 回滚 gt 删除 1 创建 kubectl create命令 2 发布 kubectl expo
  • plt.show无法显示图片

    省流 Linux系统本来就没有图形界面 import matplotlib pyplot as plt plt savefig img png 引号里是保存的路径 像此处示例就是相对路径 保存在当前文件夹 远程服务器连接Linux系统 则保
  • SpringAOP+自定义注解实现日志功能

    SpringAOP 自定义注解实现日志功能 上篇文章讲解了springAOP实现简单日志功能 这次讲解使用自定义注解实现日志功能 具体pom Spring SpringMVC的配置不再进行讲解 详情点击链接查看SpringAOP Aspec
  • 前端性能优化之Gzip

    前端性能优化之Gzip 什么是GZIP gzip是GNUzip的缩写 它是一个GNU自由软件的文件压缩程序 它是Jean loupGailly和MarkAdler一起开发的 压缩原理 Gzip 压缩背后的原理 是在一个文本文件中找出一些重复
  • Flutter 23: 图解 PopupMenu 那些事儿

    小菜需要处理标题栏弹出对话框 PopupMenu 样式 Flutter 当然提供了一些处理方式 类似 PopupMenuEntry 等 小菜仅就最基础的使用方式进行初步的学习和整理 PopupMenuItem 基本样式 PopupMenuI
  • 同态加密的基本概念

    所谓的同态加密 HE homomorphic encryption 是指 对明文m加密 得到密文c 满足f c 是f m 的密文 其中f是任意属于某个函数族F的函数 明文可以是单个明文 也可以是明文向量 对应的为单个密文和密文向量 而对应的
  • JAVA多线程之当一个线程在执行死循环时会影响另外一个线程吗?

    一 问题描述 假设有两个线程在并发运行 一个线程执行的代码中含有一个死循环如 while true 当该线程在执行while true 中代码时 另一个线程会有机会执行吗 二 示例代码 代码来源于互联网 1 public class Ser