Java中一个线程执行死循环有什么后果
作者:hapjin 发布时间:2022-05-24 00:28:35
标签:java,线程,死循环
假设有两个线程在并发运行,一个线程执行的代码中含有一个死循环如:while(true)....当该线程在执行while(true)中代码时,另一个线程会有机会执行吗?
示例代码(代码来源于互联网)
public class Service {
Object object1 = new Object();
public void methodA() {
synchronized (object1) {
System.out.println("methodA begin");
boolean isContinueRun = true;
//在这里执行一个死循环
while (isContinueRun) {
}
System.out.println("methodA end");
}
}
Object object2 = new Object();
public void methodB() {
synchronized (object2) {
System.out.println("methodB begin");
System.out.println("methodB end");
}
}
}
两个线程类的实现如下:
import service.Service;
public class ThreadA extends Thread {
private Service service;
public ThreadA(Service service) {
super();
this.service = service;
}
@Override
public void run() {
service.methodA();
}
}
线程A执行methodA(),methodA()中有一个死循环
import service.Service;
public class ThreadB extends Thread {
private Service service;
public ThreadB(Service service) {
super();
this.service = service;
}
@Override
public void run() {
service.methodB();
}
}
线程B执行methodB(),当线程A进入methodA()中的while死循环时,线程B的能不能执行完成?
测试类
import service.Service;
import extthread.ThreadA;
import extthread.ThreadB;
public class Run {
public static void main(String[] args) {
Service service = new Service();
ThreadA athread = new ThreadA(service);
athread.start();
ThreadB bthread = new ThreadB(service);
bthread.start();
}
}
由于线程A和线程B获得的对象锁不是同一把锁,从结果中可以看出,线程B是可以执行完成的。而线程A由于进入了while死循环,故线程A一直执行运行下去了(整个程序未结束),但线程B会结束。
也就是说,尽管线程A一直在while中执行,需要占用CPU。但是,线程的调度是由JVM或者说是操作系统来负责的,并不是说线程A一直在while循环,然后线程B就占用不到CPU了。对于线程A而言,它就相当于一个“计算密集型”作业了。如果我们的while循环是不断地测试某个条件是否成立,那么这种方式就很浪费CPU,可参考一个具体的实例:JAVA多线程之线程间的通信方式 中的“线程间的通信方式”第二点while轮询。
如果把Service.java修改成如下:
public class Service {
// Object object1 = new Object();
public void methodA() {
synchronized (this) {
System.out.println("methodA begin");
boolean isContinueRun = true;
//在这里执行一个死循环
while (isContinueRun) {
}
System.out.println("methodA end");
}
}
// Object object2 = new Object();
public void methodB() {
synchronized (this) {
System.out.println("methodB begin");
System.out.println("methodB end");
}
}
}
若线程A先获得对象锁时,由于while循环,线程A一直在while空循环中。而线程B也因为无法获得锁而执行不了methodB()。
可以看出,如果在一个线程在synchronized方法中无法退出,无法将锁释放,另一个线程就只能无限等待了。


猜你喜欢
- 简介mutable(可变)和immutable(不可变)对象是我们在java程序编写的过程中经常会使用到的。可变类型对象就是说,对象在创建之
- WebService是一种传统的SOA技术架构,它不依赖于任何的编程语言,也不依赖于任何的技术平台,可以直接基于HTTP协议实现网络应用间的
- 一、概述UDP和TCP是网络通讯常用的两个传输协议,C#一般可以通过Socket来实现UDP和TCP通讯,由于.NET框架通过UdpClie
- 涉及access_token的获取请参考《C#微信公众平台开发之access_token的获取存储与更新》一、为了实现高级群发功能,需要解决
- 使用开源框架是,可以直接复制源代码到自己的项目(本人在Android Studio中操作报R程序包不存在),也可以使用jar包,下面记录一下
- 多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用
- 什么是二叉堆二叉堆就是完全二叉树,或者是靠近完全二叉树结构的二叉树。在二叉树建树时采取前序建树就是建立的完全二叉树。也就是二叉堆。所以二叉堆
- 在 C# 中反射技术应用广泛,至于什么是反射.........你如果不了解的话,请看下段说明,否则请跳过下段。广告一下:喜欢我文章的朋友请关
- 本文实例讲述了java生成随机数的方法。分享给大家供大家参考。具体实现方法如下:package com.tool.code; import
- 什么是 terms set 查询?Terms set 查询根据匹配给定字段的精确术语的最少数量返回文档。terms set 查询与 term
- 数据存储与访问常用方式:文件SharedPreferences(偏好参数设置)SQLite数据库内容提供者(Content provider
- 看到正点闹钟上的设置时间的滑动效果非常好看,自己就想做一个那样的,在网上就开始搜资料了,看到网上有的齿轮效果的代码非常多,也非常难懂,我就决
- 场景:使用Fragment实现切页。类结构:一:ActivityActivity中使用getSupportFragmentManager()
- 1,内容简介所谓的定时调度,是指在无人值守的时候系统可以在某一时刻执行某些特定的功能采用的一种机制,对于传统的开发而言,定时调度的操作分为两
- 这篇文章主要介绍了Spring Cloud Zuul添加过滤器过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学
- 本文为大家分析了Java中字符流与字节流的区别,供大家参考,具体内容如下1. 什么是流 Java中的流是
- C#编写一个简易计算器,供大家参考,具体内容如下界面代码using System;using System.Collections.Gene
- 背景现行的文本编辑器大多都具备文本查询的能力,但是并不能直观的告诉用户两段文字的细微差异,所以对比工具在某种情况下,就起到了很便捷的效率。关
- 一:什么是Hystrix在分布式环境中,许多服务依赖项中的一些将不可避免地失败。Hystrix是一个库,通过添加延迟容差和容错逻辑来帮助您控
- 本章节更加具体化的学习编译器还有哪些可以优化的方便,让你的应用展现出更好的性能。JIT编译器版本JIT编译器有不同的版本,而最终你使用哪种,