Java多线程编程并发编程

Java 多线程与并发编程全面指南 Java 作为一门成熟的企业级编程语言,提供了丰富的多线程与并发编程支持,使开发者能够构建高性能、高并发的应用程序。然而,多线程编程也带来了复杂性,包括线程安全、死锁、竞态条件等问题。本文将全面介绍 Java 多线程与并发编程的各个方面。 阅读详情

一、Java多线程编程并发编程

第一节 Java基础

线程状态

Java线程有6个状态定义:java.lang.Thread.State

  1. New:尚未启动的线程的线程状态;
  2. Runnable:可运行线程的线程状态,等待CPU调度;
  3. Blocked: 线程阻塞等待监视器锁定的线程状态,处于synchronized同步代码块或方法中被阻塞;
  4. Waiting:等待线程的线程状态,下列不带超时的方式:Object.wait、Thread.join、LockSupport.park;
  5. Timed Waiting:具有指定等待时间的等待线程的线程状态。带超时的方式:Thread.sleep、Object.wait、Thread.join、LockSupport.parkNanos、LockSupport.parkUntil;
  6. Terminated :终止线程的线程状态。线程正常完成执行或者出现异常。

状态流程图:
在这里插入图片描述

具体状态可以运行如下Demo进行简单的了解

/**
 * 示例2 - 多线程运行状态切换示例 <br/>
 */
public class Demo1 {
	public static Thread thread1;
	public static Demo1 obj;

	public static void main(String[] args) throws Exception {
		// 第一种状态切换 - 新建 -> 运行 -> 终止
		System.out.println("#######第一种状态切换  - 新建 -> 运行 -> 终止################################");
		Thread thread1 = new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println("thread1当前状态:" + Thread.currentThread().getState().toString());
				System.out.println("thread1 执行了");
			}
		});
		System.out.println("没调用start方法,thread1当前状态:" + thread1.getState().toString());
		thread1.start();
		Thread.sleep(2000L); // 等待thread1执行结束,再看状态
		System.out.println("等待两秒,再看thread1当前状态:" + thread1.getState().toString());
		// thread1.start(); TODO 注意,线程终止之后,再进行调用,会抛出IllegalThreadStateException异常

		System.out.println();
		System.out.println("############第二种:新建 -> 运行 -> 等待 -> 运行 -> 终止(sleep方式)###########################");
		Thread thread2 = new Thread(new Runnable() {
			@Override
			public void run() {
				try {// 将线程2移动到等待状态,1500后自动唤醒
					Thread.sleep(1500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("thread2当前状态:" + Thread.currentThread().getState().toString());
				System.out.println("thread2 执行了");
			}
		});
		System.out.println("没调用start方法,thread2当前状态:" + thread2.getState().toString());
		thread2.start();
		System.out.println("调用start方法,thread2当前状态:" + thread2.getState().toString());
		Thread.sleep(200L); // 等待200毫秒,再看状态
		System.out.println("等待200毫秒,再看thread2当前状态:" + thread2.getState().toString());
		Thread.sleep(3000L); // 再等待3秒,让thread2执行完毕,再看状态
		System.out.println("等待3秒,再看thread2当前状态:" + thread2.getState().toString());

		System.out.println();
		System.out.println("############第三种:新建 -> 运行 -> 阻塞 -> 运行 -> 终止###########################");
		Thread thread3 = new Thread(new Runnable() {
			@Override
			public void run() {
				synchronized (Demo2.class) {
					System.out.println("thread3当前状态:" + Thread.currentThread().getState().toString());
					System.out.println("thread3 执行了");
				}
			}
		});
		synchronized (Demo2.class) {
			System.out.println("没调用start方法,thread3当前状态:" + thread3.getState().toString());
			thread3.start();
			System.out.println("调用start方法,thread3当前状态:" + thread3.getState().toString());
			Thread.sleep(200L); // 等待200毫秒,再看状态
			System.out.println("等待200毫秒,再看thread3当前状态:" + thread3.getState().toString());
		}
		Thread.sleep(3000L); // 再等待3秒,让thread3执行完毕,再看状态
		System.out.println("等待3秒,让thread3抢到锁,再看thread3当前状态:" + thread3.getState().toString());

	}
}

运行结果:

#######第一种状态切换  - 新建 -> 运行 -> 终止################################
没调用start方法,thread1当前状态:NEW
thread1当前状态:RUNNABLE
thread1 执行了
等待两秒,再看thread1当前状态:TERMINATED

############第二种:新建 -> 运行 -> 等待 -> 运行 -> 终止(sleep方式)###########################
没调用start方法,thread2当前状态:NEW
调用start方法,thread2当前状态:RUNNABLE
等待200毫秒,再看thread2当前状态:TIMED_WAITING
thread2当前状态:RUNNABLE
thread2 执行了
等待3秒,再看thread2当前状态:TERMINATED

############第三种:新建 -> 运行 -> 阻塞 -> 运行 -> 终止###########################
没调用start方法,thread3当前状态:NEW
调用start方法,thread3当前状态:RUNNABLE
等待200毫秒,再看thread3当前状态:BLOCKED
thread3当前状态:RUNNABLE
thread3 执行了
等待3秒,让thread3抢到锁,再看thread3当前状态:TERMINATED

线程中止

如何中止一个线程:

1、不正确的线程中止-Stop
a、Stop:中止线程,并且清除监控器锁的信息,但是可能导致线程安全,JDK不建议用。
b、Destroy:JDK未实现该方法。
线程不安全演示:


public class StopThread extends Thread {
	private int i = 0, j = 0;

	@Override
	public void run() {
		synchronized (this) {
			// 增加同步锁,确保线程安全
			++i;
			try {
				// 休眠10秒,模拟耗时操作
				Thread.sleep(10000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			++j;
		}
	}

	/** * 打印i和j */
	public void print() {
		System.out.println("i=" + i + " j=" + j);
	}
}
/**
 * 示例3 - 线程stop强制性中止,破坏线程安全的示例
 */
public class Demo3 {
	public static void main(String[] args) throws InterruptedException {
		StopThread thread = new StopThread();
		thread.start();
		// 休眠1秒,确保i变量自增成功
		Thread.sleep(1000);
		// 暂停线程
		thread.stop(); // 错误的终止
		// thread.interrupt(); // 正确终止
		while (thread.isAlive()) {
			// 确保线程已经终止
		} // 输出结果
		thread.print();
	}
}

运行结果:
thread.stop()方式中止线程,会有线程安全的问题,导致实际运行结果:i=1 j=0,线程安全的前提下:i=1 j=1。
thread.interrupt()中止线程,程序会以抛出java.lang.InterruptedException异常来通知线程中止,捕捉该异常,当前线程会执行完后续操作,保证线程的安全性。

正确中止线程的方法:interrupt

二、通过标志位来中止线程
代码逻辑中,增加一个判断,用来控制线程执行的中止。

/** 通过状态位来判断 */
public class Demo4 extends Thread {
	
	public volatile static boolean flag = true;
	
	public static void main(String[] args) throws InterruptedException {
		new Thread(() -> {
			while (flag) { // 判断是否运行
				System.out.println("运行中");
				try {
					Thread.sleep(1000L);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}).start();
		// 3秒之后,将状态标志改为False,代表不继续运行
		Thread.sleep(3000L);
		flag = false;
		System.out.println("程序运行结束");
	}
}

线程通信

1、文件共享
线程1将数据写入到文件系统,线程2可以通过读取该文件实现数据的共享

2、变量共享
利用内存的公共区域。如:定义共享变量,线程1对变量写入数据,线程2来读取数据。
3、线程协作–JDK API
JDK中对于需要多线程协作完成某一任务的场景,提供了对应API支持。
多线程协作的典型场景是:生产者 - 消费者模型。(线程阻塞
线程唤醒)
示例:线程1去买包子,没有包子,则不再执行。线程2生产出包子,通知线程1继续执行。

  1. suspend和resume
  2. wait和notify
  3. park和unpark

区别:
第一种容易产生死锁:
1、同步代码块中使用,由于suspend挂起后并不会释放锁,容易造成死锁;
2、执行顺序也可能造成死锁,suspend比resume后执行的情形;
这两个API已废弃。

/** 死锁的suspend/resume。 suspend并不会像wait一样释放锁,故此容易写出死锁代码 */
	public void suspendResumeDeadLockTest() throws Exception {
		// 启动线程
		Thread consumerThread = new Thread(() -> {
			if (baozidian == null) { // 如果没包子,则进入等待
				System.out.println("1、进入等待");
				// 当前线程拿到锁,然后挂起
				synchronized (this) {
					Thread.currentThread().suspend();
				}
			}
			System.out.println("2、买到包子,回家");
		});
		consumerThread.start();
		// 3秒之后,生产一个包子
		Thread.sleep(3000L);
		baozidian = new Object();
		// 争取到锁以后,再恢复consumerThread
		synchronized (this) {
			consumerThread.resume();
		}
		System.out.println("3、通知消费者");
	}
/** 导致程序永久挂起的suspend/resume */
	public void suspendResumeDeadLockTest2() throws Exception {
		// 启动线程
		Thread consumerThread = new Thread(() -> {
			if (baozidian == null) {
				System.out.println("1、没包子,进入等待");
				try { // 为这个线程加上一点延时
					Thread.sleep(5000L);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				// 这里的挂起执行在resume后面
				Thread.currentThread().suspend();
			}
			System.out.println("2、买到包子,回家");
		});
		consumerThread.start();
		// 3秒之后,生产一个包子
		Thread.sleep(3000L);
		baozidian = new Object();
		consumerThread.resume();
		System.out.println("3、通知消费者");
		consumerThread.join();
	}

第二种wait和notify这些方法只能由同一对象锁的持有者线程调用,也就是写在同步代码块里面,否则会抛出IllegalMonitorStateException异常。
wait方法会将当前线程等待,加入该对象的等待集合中,并且放弃当前持有的对象锁。
notify/notifyAll方法会唤醒一个或所有正在等待这个对象锁的线程。
如果在notify被调用之后,才开始wait方法的调用,线程会永远处于waiting状态。

/** 正常的wait/notify */
	public void waitNotifyTest() throws Exception {
		// 对象中增加一个wait线程
		new Thread(()->{
			synchronized (this) {
				try {
					this.wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				System.out.println("我也被唤醒了");
			}
		}).start();
		// 启动线程
		new Thread(() -> {
				synchronized (this) {
					while (baozidian == null) { // 如果没包子,则进入等待
					try {
						System.out.println("1、进入等待");
						this.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
			System.out.println("2、买到包子,回家");
		}).start();
		// 3秒之后,生产一个包子
		Thread.sleep(3000L);
		baozidian = new Object();
		synchronized (this) {
			this.notifyAll();
			System.out.println("3、通知消费者");
		}
	}

	/** 会导致程序永久等待的wait/notify */
	public void waitNotifyDeadLockTest() throws Exception {
		// 启动线程
		new Thread(() -> {
			if (baozidian == null) { // 如果没包子,则进入等待
				try {
					Thread.sleep(5000L);
				} catch (InterruptedException e1) {
					e1.printStackTrace();
				}
				synchronized (this) {
					try {
						System.out.println("1、进入等待");
						this.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
			System.out.println("2、买到包子,回家");
		}).start();
		// 3秒之后,生产一个包子
		Thread.sleep(3000L);
		baozidian = new Object();
		synchronized (this) {
			this.notifyAll();
			System.out.println("3、通知消费者");
		}
	}

第三种
1、unpark先执行唤醒,线程中的park后执行,该线程还能继续被唤醒,不会有先后顺序的问题;
2、同步代码块中不会释放锁

/** 正常的park/unpark */
	public void parkUnparkTest() throws Exception {
		// 启动线程
		Thread consumerThread = new Thread(() -> {
			while (baozidian == null) { // 如果没包子,则进入等待
				System.out.println("1、进入等待");
				try {
					// 模拟业务场景,主线程中的unpark先执行唤醒,线程中的park后执行,该线程还能继续被唤醒
					Thread.sleep(6000L);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				LockSupport.park();
			}
			System.out.println("2、买到包子,回家");
		});
		consumerThread.start();
		// 3秒之后,生产一个包子
		Thread.sleep(3000L);
		baozidian = new Object();
		LockSupport.unpark(consumerThread);
		System.out.println("3、通知消费者");
	}

	/** 死锁的park/unpark */
	public void parkUnparkDeadLockTest() throws Exception {
		// 启动线程
		Thread consumerThread = new Thread(() -> {
			if (baozidian == null) { // 如果没包子,则进入等待
				System.out.println("1、进入等待");
				// 当前线程拿到锁,然后挂起
				synchronized (this) {
					LockSupport.park();
				}
			}
			System.out.println("2、买到包子,回家");
		});
		consumerThread.start();
		// 3秒之后,生产一个包子
		Thread.sleep(3000L);
		baozidian = new Object();
		// 争取到锁以后,再恢复consumerThread
		synchronized (this) {
			LockSupport.unpark(consumerThread);
		}
		System.out.println("3、通知消费者");
	}
Java 并发编程与多线程 Java 并发编程和多线程是高级开发中的一个重要部分,涉及多线程的创建、线程协同、线程安全、性能优化、并发工具等内容。 阅读详情

相关推荐

Java并发编程:多线程与锁机制

在Java编程中,并发编程是一个重要且复杂的领域。多线程与锁机制是并发编程中的核心概念,它们允许程序同时执行多个任务,提高程序的响应性和效率。然而,不正确的使用多线程和锁机制也可能导致数据不一致、死锁等问题。本文将结合优快云网站上的相关讨论,深入探讨Java并发编程中的多线程与锁机制,通过代码示例和表格分析,提供实用的解决技巧。

shejizuopin的博客 989

Java多线程并发编程技术详解

Java多线程并发编程是一项需要深入理解和熟练掌握的技术,只有合理地设计和使用多线程,才能真正发挥其在提升系统性能方面的巨大潜力。随着对Java并发机制及工具类库的深入学习和应用,开发者可以更好地构建高效、稳定的并发系统。

聚焦于深度解析最新的编程语言特性、框架升级、架构设计、开发工具和最佳实践,涵盖Web前端(如Vue3, React, Angular等)、后端开发(如Node.js, Java, Python等)、移动端开发(iOS, Android原生及跨平台开发) 3万+

深入理解 Java 多线程并发编程的核心原理与实践技巧

通过深入理解Java多线程的核心原理,以及合理使用Java提供的并发工具类和同步机制,开发者可以更加高效地编写出线程安全、可扩展的多线程程序。尤其在处理大量并发任务或高负载应用时,掌握并发编程的核心原理和实践技巧,能够让开发者有效应对复杂的编程挑战。本文将深入探讨Java多线程并发编程的核心原理,并结合实践技巧,帮助开发者更好地应对并发编程的挑战。掌握多线程编程的艺术,不仅仅是理解各种同步机制和并发工具,更重要的是要学会在实践中灵活应用这些技术,提升程序的性能、稳定性和可维护性。:控制多个线程的执行顺序。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1047

Java多线程和并发编程

Java多线程和并发编程 多进程 程序不再是顺序执行了,上下两个while循环在交替运行 多线程只能打开一个程序,但是程序运行中是可以好几个函数交替执行 多进程是可以打开好几个程序 Start方法会自动以新进程调用run方法,底层使用JNI来实现的 Start会自动触发run方法,这是Thread自己的一个机制,也就相当于认识start和run这两个...

hxxjxw的博客 808

掌握Java多线程并发编程的艺术:高级模式与最佳实践

在现代软件开发中,随着应用程序复杂度的增加以及硬件资源(如多核CPU)的普及,如何有效地利用多线程来提升程序性能成为了开发者必须面对的问题。Java作为一门支持多线程的强大语言,提供了丰富的API和工具帮助我们构建高效的并发程序。今天,我们将深入探讨Java多线程并发编程中的高级模式与实践,不仅涵盖理论知识,还将通过详细的代码示例展示如何在实际项目中应用这些技术。

墨夶的博客 1746

课程复习---分析空间数据的细胞空间关系(python版本的mistyR)

课程复习---分析空间数据的细胞空间关系(python版本的mistyR)

weixin_53637133的博客 1222

Java 并发编程之一——天生的多线程语言

Java 是一门支持并发编程的语言,它通过提供内置的多线程支持使得程序能够执行多任务并且提高效率。在一个简单的 Java 程序中,就算是最基本的main函数运行时,实际上也会有多个系统级别的线程同时运行,提供不同的服务。执行结果显示了除了主线程 (main) 之外,还有一些如垃圾回收器的辅助线程 (Finalizer),信号分发线程 ()等,这些线程都是 Java 虚拟机为了优化执行和管理工作而自动创建的。

君若雅的博客 1169

阿里云百炼平台创建智能体-上传文档

阿里云百炼智能体-上传文档文件

weixin_43930851的博客 1356

java并发编程——多线程

本章主要介绍java中多线程并发编程基础知识,包括的内容有: 进程,线程,协程的区别 多线程的实现方式 线程中断和优先级 线程状态的切换 一、进程、线程和协程 1.1 进程、线程和协程 进程是资源分配的最小单位,操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源)。进程拥有自己独立的堆和栈,既不共享堆,也不共享栈。 线程是CPU调度的最小单位,线程有自己的堆栈和局部变量,...

西木风落 1020

第18届全国大学生智能汽车竞赛四轮车控制策略深度解析:从舵机PID到速度闭环

本文深度解析了第18届全国大学生智能汽车竞赛中四轮车的核心控制策略。从舵机PID方向控制的基础原理与机械校准入手,详细阐述了误差计算、PD控制等关键环节;进而深入探讨了基于编码器的速度闭环控制,包括增量式PI算法与速度决策逻辑。文章结合实战经验,提供了方向环与速度环的协同调参思路与避坑指南,旨在帮助参赛者构建稳定、高效的智能车控制系统。

potato的博客 463

玉米群体遗传分析实战:如何用IQtree和VCF文件快速构建系统发育树(附避坑指南)

本文详细介绍了如何利用IQtree和VCF文件进行玉米群体遗传分析,并快速构建可靠的系统发育树。文章重点解析了从VCF格式转换到PHYLIP格式的实用技巧,强调了使用ASC模型校正SNP数据偏差的重要性,并提供了完整的参数设置、常见报错解决方案及结果评估指南,帮助研究者高效完成分析并规避常见陷阱。

leaf8的博客 607

Java 多线程并发编程

与进程相比,线程更“轻量”,共享所属进程的资源(如内存空间、文件描述符等),减少了创建与切换成本。在经典生产者 - 消费者场景,生产者生产物品放入共享缓冲区,消费者从缓冲区取物品消费,需协调二者速度避免缓冲区溢出或空等情况。对象锁定代码块,功能类似,却能更灵活把控同步范围,降低锁粒度,减少不必要阻塞,提升并发效率。频繁创建、销毁线程开销大,线程池可统一管理线程,复用已有线程执行任务,提升系统性能与稳定性。创建固定 3 个线程的线程池,循环提交 10 个任务,线程池自动调度线程执行,任务结束可调用。

leo__520的博客 717

2024年数字IC秋招-睿思芯科-IC验证工程师-笔试题

公司介绍:初创公司,做risc-v,公司位于深圳笔试题型:基础题(10个) + 选做题(5个)笔试平台:showmebug(电脑监控)笔试时间:1h个人感受:每年rsxk的题目好像是一样的,起码今年和去年的题目是相同的,但是做完笔试题目就没有消息了。

qq_42135020的博客 1582

如何理解应用 Java 多线程与并发编程?

多线程(Multithreading)是指在一个进程内同时运行多个线程,每个线程执行一段独立的代码片段。每个线程都有自己的任务,并且可以共享同一个内存空间。对于现代计算机来说,多线程可以提升程序的执行效率,尤其在处理大规模计算或 I/O 操作时,多线程能够有效减少程序的等待时间。在 Java 中,线程可以通过继承Thread类或实现Runnable接口来创建。并发编程(Concurrency Programming)是指在程序中同时处理多个任务的能力。

龚小帅的博客 1298

激光雷达点云可视化:Open3D与PCL实战

激光雷达点云可视化:Open3D与PCL实战 ,人工智能,计算机视觉,大模型,AI,该文围绕激光雷达点云可视化,介绍了Open3D与PCL的实战应用。先阐述点云基础概念、特点及可视化意义,接着讲解Open3D的简介、环境配置,以及其在点云读取、显示、颜色设置、下采样和滤波等方面的实战操作,还介绍了PCL的基础、环境配置及相关实战,包括点云读取、显示、颜色设置、下采样和滤波,同时对比了两者的易用性、功能覆盖、性能和适用场景,给出综合实战案例与常见问题解决方法,为点云可视化处理提供了全面指导。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 12万+

海上通信技术发展与研究综述

通过对海浪模型、节点运动特性、天线辐射特性等进行特征深度学习,考虑改变有效链路的持续时间、业务类型和容量的区别,以及卫星和节点的仰角等,改变通信策略,设计动态波束成形算法,优化折中浮标天线增益和波束宽度,适应海上环境,尤其是海浪运动时变的特性。目前的海上通信系统,同时包括海上无线通信系统、卫星通信系统、岸基通信系统、船载基站通信系统、空中基站通信系统等不同方法组成的通信系统来满足不同的需求,如海上无线通信系统通信成本低廉、卫星通信系统具有广域的覆盖范围、岸基通信网络可以实现数据高速传输。

weixin_70923796的博客 1000

Java中的多线程与并发编程

Java多线程与并发编程是构建高性能应用的重要技术。本文从线程基础、线程创建方式、同步机制到并发工具类,全面介绍了Java并发编程的核心概念和实现方式。在实际开发中,我们需要根据具体场景选择合适的并发控制机制,遵循线程安全设计原则,避免常见的并发陷阱。随着Java版本的更新,并发编程API也在不断完善。Java 8引入的CompletableFuture、Java 9引入的响应式编程Flow API等,为并发编程提供了更多可能性。

vincent的博客 1236

金三银四!风控建模岗面试题库大全:从理论到实战避坑指南

风控建模面试大全

阿黎逸阳的博客 767

关于 java:7. 多线程与并发编程

System.out.println("守护线程");});// 设置为守护线程(主线程退出,它也退出)// 设置线程名称,方便调试和逆向时识别t.start();是一个函数式接口,可用 lambda 表达式实现;call()方法执行任务逻辑并返回一个结果;可以抛出受检异常(Exception。

Triste__chengxi的博客 1583

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java中的多线程和并发编程

大家好,我是城南。在当今这个信息爆炸的时代,了解和掌握多线程和并发编程技术已经成为Java开发者的必备技能。无论你是新手小白,还是经验丰富的开发者,本文将带你深入浅出地探讨Java中的多线程和并发编程,让你轻松驾驭这一复杂但又至关重要的领域。

weixin_46372265的博客 1013

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java多线程与并发编程全面解析-高效任务调度与优化策略

多线程是指在单个程序中同时运行多个线程,每个线程都可以独立完成特定的任务。Java通过Thread类和Runnable接口提供了多线程的基本实现。Java中的多线程和并发编程是现代应用开发中非常重要的一部分,它们能够显著提升系统的响应能力和处理能力。然而,要实现高效的并发编程并非易事,需要开发者在任务调度、资源管理和并发控制方面进行深入设计。任务调度策略:通过优先级调度、固定时间间隔调度和延迟调度等策略,开发者可以更灵活地控制多线程任务的执行,确保重要任务的及时处理,并提高系统的吞吐量和响应速度。

一键难忘的博客 3119

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Java并发编程(十一)多线程并发编程

此文为读书笔记,欢迎评论,谈论问题,共同进步! 什么是多线程并发编程 先区分下并发和并行: 并发是指同一个时间段内多个任务同时都在执行,并且都没有执行结束; 并行是说在单位时间内多个任务同时在执行; 并发任务强调在一个时间段内同时执行,而一个时间段由多个单位时间累积而成,所以说并发的多个任务在单位时间内不一定同时在执行。 在单CPU的时代多个任务都是并发执行的,这是因为单个 CPU同时只能执行一个任务。在单 CPU时代多任务是共享一个CPU的,当一个任务占用 CPU运行时,其他任务就会被挂起,当占用C

逆流者的博客 492

关于Java多线程以及Java并发编程

Java多线程与Java并发编程 对于计算机而言,CPU是极其重要的资源,如何高效的利用CPU资源成为提高程序执行性能时的必经之路。此时就不得不提到两组眼熟的名词:并行与并发、进程和线程。 并行&并发 并行:同时执行,一只手画圆形,一只手画方形,同时进行; 并发:在一段时间间隔内交替执行,右手(或左手),画完圆形画方形。 进程&线程 进程:一个程序的一次执行就是一个进程,进程是一个...

qq_40655613的博客 193

【Java多线程】10 Java 并发编程的最佳实践

通过将对象的状态设为不可更改,可以避免数据竞争和不一致的状态。使用线程池时,合理配置线程池的大小,可以有效提高并发性能。根据任务的性质和系统的资源状况来选择合适的线程池类型(如固定大小、可缓存等)。通过分析 CPU 和内存的使用情况、线程的活跃度等,找出性能瓶颈并进行优化。Java 提供了丰富的并发工具和类,尽量使用这些已有的并发类,而不是自己实现复杂的同步逻辑。长时间持有锁会降低并发性能,尽量将锁的持有时间缩短,避免在持有锁时执行耗时操作。在设计并发系统时,选择合适的锁策略非常重要。

A1924的博客 1276

java多线程和并发编程面试题

多线程和并发编程 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成该任务只需10毫秒。 2) 线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并发执行不同的任务。不同的进程使用...

baidu_28283827的博客 1万+
上一篇: Linux 下 OpenJDK 卸载、Oracle JDK安装
下一篇: Java高级-中间件专题
jthing
博客等级 码龄11年 1粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值