传统线程通讯执行过程中的通信是通过Object类的wait()、notify()、notifyAll()方法来实现的,下面我们通过一个案例来学习一下这些方法。
案例:
假设现在存在两个线程,主线程main与一个子线程,首先子线程执行5次,然后切换到主线程执行10次,再切换至子线程执行5次,主线程执行10次,如此各循环3次。
程序代码如下:
/** * * @author 吖大哥 * @date May 24, 2014 5:08:12 PM */ public class ConditionTest { public static void main(String[] args) { final Business2 b = new Business2(); // 启动线程1 执行20次 new Thread(new Runnable() { public void run() { for (int i = 0; i < 3; i++) { b.sub1(i); } } }).start(); for (int i = 0; i < 3; i++) { b.main2(i); } } } class Business2 { private boolean action = true; public synchronized void sub1(int once) { while (!action) {// try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } for (int i = 0; i < 5; i++) { System.out.println("Sub1 " + once + " runing *********" + i); } action = false; this.notify(); } public synchronized void main2(int once) { while (action) {// try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } for (int i = 0; i < 10; i++) { System.out.println("Main2 " + once + " runing *********" + i); } action = true; this.notify(); } }
输出结果:
Sub1 0 runing *********0 Sub1 0 runing *********1 Sub1 0 runing *********2 Sub1 0 runing *********3 Sub1 0 runing *********4 Main2 0 runing *********0 Main2 0 runing *********1 Main2 0 runing *********2 Main2 0 runing *********3 Main2 0 runing *********4 Main2 0 runing *********5 Main2 0 runing *********6 Main2 0 runing *********7 Main2 0 runing *********8 Main2 0 runing *********9 Sub1 1 runing *********0 Sub1 1 runing *********1 Sub1 1 runing *********2 Sub1 1 runing *********3 Sub1 1 runing *********4 Main2 1 runing *********0 Main2 1 runing *********1 Main2 1 runing *********2 Main2 1 runing *********3 Main2 1 runing *********4 Main2 1 runing *********5 Main2 1 runing *********6 Main2 1 runing *********7 Main2 1 runing *********8 Main2 1 runing *********9 Sub1 2 runing *********0 Sub1 2 runing *********1 Sub1 2 runing *********2 Sub1 2 runing *********3 Sub1 2 runing *********4 Main2 2 runing *********0 Main2 2 runing *********1 Main2 2 runing *********2 Main2 2 runing *********3 Main2 2 runing *********4 Main2 2 runing *********5 Main2 2 runing *********6 Main2 2 runing *********7 Main2 2 runing *********8 Main2 2 runing *********9
相关推荐
此外,过多的线程切换和通信开销也可能导致性能下降。 CompletionService是一个高级的并发工具,它结合了Executor和BlockingQueue的功能,允许处理已完成的任务,而无需等待所有任务完成。这对于处理大量并发任务并...
在深入探讨多线程Unix编程之前,...学习笔记中的内容可能涵盖了以上各个知识点的实例、代码示例和解析,帮助你理解和实践多线程Unix编程。通过不断实践和学习,你将能够熟练地在Unix环境中编写高效的多线程应用程序。
### VC学习笔记之四:多线程知识 #### 4.1 线程的概念 在探讨多线程之前,我们需要先理解基本概念。Windows是一个多任务操作系统,它支持同时运行多个程序。当我们启动一个程序时,这个程序就会作为一个独立的进程...
线程是进程中的执行单元,比进程更轻量级,多个线程共享同一进程的资源,这降低了上下文切换的成本,提高了并发性能。 Java 语言提供对多线程的内置支持,主要有两种创建线程的方式: 1. **继承 Thread 类**:创建...
3. **线程通信**: - `WaitForSingleObject`和`WaitForMultipleObjects`函数用于线程等待指定对象的状态变化,如信号量、事件、互斥体等。 - `PostThreadMessage`发送消息到目标线程的消息队列,实现线程间的非...
#### 五、Java多线程学习笔记 ##### 1. 线程类 - **Thread类**: - 提供了创建和控制线程的方法。 - 可以通过继承`Thread`类或实现`Runnable`接口来创建线程。 ##### 2. 等待一个线程的结束 - **join()方法**: -...
### Java分布式应用学习笔记03:JVM对线程的资源同步和交互机制 在深入探讨Java虚拟机(JVM)如何处理线程间的资源同步与交互机制之前,我们先来明确几个关键概念:线程、多线程、同步、并发以及它们在Java中的实现...
### JavaWeb 学习笔记知识点总结 #### Spring Boot 和 Spring MVC 的区别 1. **Spring MVC**: - **定位**:Spring MVC 是 Spring 框架中的一个重要组成部分,主要用于构建 Web 应用程序。 - **作用**:提供了一...
### Qt4中文教程学习笔记知识点总结 #### 一、入门篇 **1.1 第一个Qt程序** 在这一节中,我们首先通过一个简单的Qt程序示例了解如何创建一个基本的窗口。为了运行这个示例,你需要按照以下步骤操作: 1. **创建...
整个笔记强调了在Android学习过程中,Java编程知识的重要性,并提供了大量代码实例来帮助新手理解Android开发的核心概念和常用组件的使用方法。这份笔记可以作为学习Android开发的入门教材,它覆盖了从基础到实战...
3. 线程通信:使用管道、消息队列、共享内存等方式实现线程间的数据交换。 4. 线程调度:操作系统负责线程的调度,按照不同的策略分配CPU时间片。 5. 线程生命周期:新建、就绪、运行、阻塞、等待、结束等状态。 三...
### Qt4 学习笔记知识点总结 #### 一、入门 **1.1 第一个Qt程序** - **程序结构:** - 在介绍Qt编程时,通常会从创建一个简单的窗口开始,即“Hello World”程序。这不仅帮助初学者熟悉Qt的编译环境和基本组件,...
《尚医通学习笔记》是针对尚医通平台的学习资料,涵盖了使用Java和SpringCloud进行系统开发的相关知识。本文将详细解析这些知识点,帮助读者深入理解如何在医疗信息化领域运用这些技术。 首先,我们来了解一下Java...
在深入探讨Linux环境下的C语言编程之前,...此外,配合书中的学习笔记,可以有针对性地关注和复习重要概念,提高学习效率。对于初学者来说,这样的资源组合是十分宝贵的,能够为Linux环境下的C语言编程打下坚实的基础。
10. **并发与多线程**:现代计算机通常执行多个任务或线程,这涉及到上下文切换、同步和互斥等概念。死锁和活锁是并发编程中可能遇到的问题。 11. **标记语言Markdown**:Markdown是一种轻量级的文本格式化语言,常...
### Java学习笔记知识点详解 #### 一、Java基础知识概述 Java是一种广泛使用的面向对象的编程语言,具有简单性、面向对象、健壮性、安全性、平台独立性、可移植性等特点。Java的基本知识包括以下几个方面: 1. **...
这个"Node.js学习笔记.rar"文件很可能包含了作者在学习Node.js过程中整理的各种知识点、示例代码和实践经验,旨在帮助读者深入理解和掌握Node.js。 1. **事件驱动编程**:Node.js的核心特性之一是其事件驱动模型。...