`
wang吖
  • 浏览: 238413 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

传统线程通信-线程执行过程中进行条件切换-学习笔记10

阅读更多

      传统线程通讯执行过程中的通信是通过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

 

 

 

 

分享到:
评论

相关推荐

    JAVA并发编程实践-线程执行-学习笔记

    此外,过多的线程切换和通信开销也可能导致性能下降。 CompletionService是一个高级的并发工具,它结合了Executor和BlockingQueue的功能,允许处理已完成的任务,而无需等待所有任务完成。这对于处理大量并发任务并...

    学习笔记多线程Unix编程

    在深入探讨多线程Unix编程之前,...学习笔记中的内容可能涵盖了以上各个知识点的实例、代码示例和解析,帮助你理解和实践多线程Unix编程。通过不断实践和学习,你将能够熟练地在Unix环境中编写高效的多线程应用程序。

    VC学习笔记之四:多线程知识.doc

    ### VC学习笔记之四:多线程知识 #### 4.1 线程的概念 在探讨多线程之前,我们需要先理解基本概念。Windows是一个多任务操作系统,它支持同时运行多个程序。当我们启动一个程序时,这个程序就会作为一个独立的进程...

    java从入门到精通学习笔记-Lesson5(多线程).pdf

    线程是进程中的执行单元,比进程更轻量级,多个线程共享同一进程的资源,这降低了上下文切换的成本,提高了并发性能。 Java 语言提供对多线程的内置支持,主要有两种创建线程的方式: 1. **继承 Thread 类**:创建...

    Win32多线程程序设计_WIN32多线程程序设计学习笔记.zip

    3. **线程通信**: - `WaitForSingleObject`和`WaitForMultipleObjects`函数用于线程等待指定对象的状态变化,如信号量、事件、互斥体等。 - `PostThreadMessage`发送消息到目标线程的消息队列,实现线程间的非...

    Java多线程文章系列.pdf

    #### 五、Java多线程学习笔记 ##### 1. 线程类 - **Thread类**: - 提供了创建和控制线程的方法。 - 可以通过继承`Thread`类或实现`Runnable`接口来创建线程。 ##### 2. 等待一个线程的结束 - **join()方法**: -...

    Java分布式应用学习笔记03JVM对线程的资源同步和交互机制

    ### Java分布式应用学习笔记03:JVM对线程的资源同步和交互机制 在深入探讨Java虚拟机(JVM)如何处理线程间的资源同步与交互机制之前,我们先来明确几个关键概念:线程、多线程、同步、并发以及它们在Java中的实现...

    学习笔记.md

    ### JavaWeb 学习笔记知识点总结 #### Spring Boot 和 Spring MVC 的区别 1. **Spring MVC**: - **定位**:Spring MVC 是 Spring 框架中的一个重要组成部分,主要用于构建 Web 应用程序。 - **作用**:提供了一...

    qt4中文教程学习笔记

    ### Qt4中文教程学习笔记知识点总结 #### 一、入门篇 **1.1 第一个Qt程序** 在这一节中,我们首先通过一个简单的Qt程序示例了解如何创建一个基本的窗口。为了运行这个示例,你需要按照以下步骤操作: 1. **创建...

    Android学习新手笔记

    整个笔记强调了在Android学习过程中,Java编程知识的重要性,并提供了大量代码实例来帮助新手理解Android开发的核心概念和常用组件的使用方法。这份笔记可以作为学习Android开发的入门教材,它覆盖了从基础到实战...

    狂神说多线程详解.rar

    3. 线程通信:使用管道、消息队列、共享内存等方式实现线程间的数据交换。 4. 线程调度:操作系统负责线程的调度,按照不同的策略分配CPU时间片。 5. 线程生命周期:新建、就绪、运行、阻塞、等待、结束等状态。 三...

    qt4学习笔记

    ### Qt4 学习笔记知识点总结 #### 一、入门 **1.1 第一个Qt程序** - **程序结构:** - 在介绍Qt编程时,通常会从创建一个简单的窗口开始,即“Hello World”程序。这不仅帮助初学者熟悉Qt的编译环境和基本组件,...

    linux c书本学习以及自己的学习笔记

    在深入探讨Linux环境下的C语言编程之前,...此外,配合书中的学习笔记,可以有针对性地关注和复习重要概念,提高学习效率。对于初学者来说,这样的资源组合是十分宝贵的,能够为Linux环境下的C语言编程打下坚实的基础。

    学习笔记-深入理解计算机系统-第二章.7z

    10. **并发与多线程**:现代计算机通常执行多个任务或线程,这涉及到上下文切换、同步和互斥等概念。死锁和活锁是并发编程中可能遇到的问题。 11. **标记语言Markdown**:Markdown是一种轻量级的文本格式化语言,常...

    Nodejs学习笔记.rar

    这个"Node.js学习笔记.rar"文件很可能包含了作者在学习Node.js过程中整理的各种知识点、示例代码和实践经验,旨在帮助读者深入理解和掌握Node.js。 1. **事件驱动编程**:Node.js的核心特性之一是其事件驱动模型。...

    UCOS-II.rar_ucOS-II笔记_操作系统笔记

    1. **线程管理**:ucOS-II支持多任务,通过线程调度器实现任务间的切换,确保系统高效运行。 2. **内存管理**:内核提供了动态内存分配与释放机制,确保内存资源的有效利用。 3. **时间管理**:包括延时函数、定时器...

    尚医通学习笔记,尚医通学习笔记

    《尚医通学习笔记》是针对尚医通平台的学习资料,涵盖了使用Java和SpringCloud进行系统开发的相关知识。本文将详细解析这些知识点,帮助读者深入理解如何在医疗信息化领域运用这些技术。 首先,我们来了解一下Java...

Global site tag (gtag.js) - Google Analytics