Java 中的多线程计数问题2024年9月10日 | 阅读 6 分钟 Java 支持单线程操作和多线程操作。单线程程序有一个入口点(main() 方法)和一个出口点。多线程程序有一个初始入口点(main() 方法),随后有许多与 main() 方法并发运行的入口点和出口点。并发(concurrency)这个术语指的是同时进行多个任务。 Java 通过在单个程序中并发运行多个线程,内置了对并发编程的支持。线程(thread),也称为轻量级进程(lightweight process),是编程操作的单一顺序流,有明确的开始和结束。在线程的生命周期中,只有一个执行点。线程本身不是一个程序,因为它无法独立运行。相反,它在一个程序内运行。 多任务处理(或多进程处理)现代操作系统(如 Windows 和 UNIX)是多任务系统。多任务系统可以通过共享计算资源(如 CPU、主内存和 I/O 通道)来并发执行多个任务。在单 CPU 机器上,一次只能执行一个任务——通过 CPU 的时间分片(time-slicing)。在多 CPU 机器上,可以通过在 CPU 之间分配任务或对 CPU 进行时间分片来同时执行一些任务。 多任务处理对于当今的操作系统来说是必需的,因为它通过充分利用和优化计算资源的利用来提高性能。通常有两种类型的多任务操作系统:
多线程(在进程内)在 UNIX 中,我们 fork 一个新进程。在 Windows 中,我们启动一个程序。进程或程序有自己的地址空间和控制块。它被称为重量级(heavyweight),因为它消耗大量系统资源。在一个进程或程序内,我们可以并发运行多个线程以提高性能。 线程与重量级进程不同,它们是轻量级的,并且在单个进程内运行——它们共享该进程的相同地址空间、分配的资源和环境。它之所以是轻量级的,是因为它在重量级进程的上下文中运行,并利用为该程序分配的资源和程序的上下文。线程必须在正在运行的进程内为自己分配资源。例如,一个线程有自己的堆栈、寄存器和程序计数器。在线程内运行的代码仅在该上下文中工作,因此,线程(顺序操作流)也被称为执行上下文(execution context)。 程序内的多线程通过优化系统资源的使用来提高程序的性能。例如,当一个线程被阻塞时(例如,等待 I/O 操作完成),另一个线程可以利用 CPU 时间执行计算,从而提高性能和整体吞吐量。 多线程对于提供更好的用户交互性也是必需的。例如,在文字处理器中,当一个线程正在打印或保存文件时,另一个线程可以用于继续键入。在 GUI 应用程序中,多线程对于提供响应式用户界面至关重要。 在本文中,我将假设我们理解 Swing 编程,因为 Swing 应用程序依赖于多线程(执行其特定功能、重绘和处理事件),并且最适合说明多线程。 一个典型的 Java 程序在一个进程中运行,并且不关心多个进程。然而,在进程内,它通常使用多个线程来并发运行多个任务。一个独立的 Java 应用程序从一个与 main() 方法关联的单个线程(称为主线程)开始。然后,这个主线程可以启动新的用户线程。 Counter.java 输出 Final Count: 6743 在此示例中,多个线程在一个循环中递增计数器。但是,由于 increment 方法未同步,存在竞态条件(race condition)的风险,最终计数可能不如预期。 SynchronizedCounter.java 输出 Final Count: 10000 计数信号量(Counting Semaphore)示例二元信号量(binary semaphore)被称为具有一个许可的计数信号量,因为它只有两种状态:可用或许不可用。为了执行互斥(mutual exclusion)或关键区域(critical section),其中只允许一个线程执行,可以使用二元信号量。线程在 acquire() 上等待,直到线程在关键区域内通过调用信号量上的 release() 来允许 release。以下是 Java 信号量计数,其中使用二元信号量为关键代码部分提供共享独占访问。 SemaphoreTest.java 输出 Thread-0 inside mutual exclusive Thread-1 inside mutual exclusive Thread-0 outside of mutual exclusive Thread-1 outside of mutual exclusive |
该类型是一种基本数据类型。它是一种单精度32位IEEE 754浮点数。它用于声明变量和方法。它表示小数。要点:float的范围是从1.40129846432481707e-45到3.40282346638528860e+38(正或负)。它的默认值是...
阅读 2 分钟
java.text.RuleBasedCollator 类具有 getRules() 函数。在创建基于规则的排序器对象时,将使用 RuleBasedCollator 类来检索将应用的规则。语法:public String getRules() 参数:此方法不接受任何参数。返回值:使用的规则...
阅读 2 分钟
Java 提供了 File 类来表示系统中的文件或目录。File 类位于 java.io 包中。为了对文件或目录执行操作,File 类提供了几种有用的方法。File 类的 delete() 方法是其中之一...
阅读 3 分钟
Java 是一种强大的面向对象编程语言,为开发人员提供了广泛的工具和功能来构建健壮且可扩展的应用程序。使 Java 脱颖而出的特性之一是它对泛型的支持。泛型允许开发人员编写泛型类和...
阅读 4 分钟
对象是 OOPs 语言的基本构建块。在 Java 中,没有对象我们就无法执行任何程序。有多种创建 Java 对象的方法,我们将在本节中讨论,并学习如何创建……
阅读 6 分钟
Java 中的 File 抽象地表示文件或目录的路径。因为它可以让开发人员在不必要时直接与底层文件系统交互的情况下处理文件路径和操作,所以这种抽象至关重要。许多 Java 应用程序经常需要……
阅读 4 分钟
在 Java 中,计算 N 的 N 次方的 N 的阶乘的位数是一个引人入胜的难题。随着 N 的增加,结果可能会变得非常大,需要谨慎处理。该任务涉及计算最终结果的位数,并调用...
5 分钟阅读
桶排序是一种排序技术,其中元素首先被均匀地分成几个称为桶的组。之后,使用任何排序算法对元素进行排序,最后,按排序顺序收集元素。在本节中,我们将学习桶排序...
5 分钟阅读
在早期手机中,短信是通过数字键盘实现的。每个数字键 (2-9) 都对应一组字母,用户必须多次按下按键才能获得所需的字符。例如,按下 '2' 一次将得到 'A',按下...
阅读 8 分钟
Python 和 Java 是使用最广泛的两种编程语言。它们是流行的高级通用编程语言。开发人员使用 Java 来创建桌面和在线应用程序,而 Python 则用于数据科学和机器学习应用程序的开发。在这两者之间进行选择...
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India