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

Condition线程通信-线程执行过程中进行条件切换-学习笔记11

阅读更多

Java5 中提过了Condition ,该类可以实现线程间的条件控制,废话少说直接来看一个实例。

实例:

       启动两根子线程,连同主线程一共3根线程,实现子线程1执行5次切换至子线程2执行5次,再切换至主线程执行5,然后切换至子线程1执行5次,如此往复3次,程序退出。

 

程序代码:

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 通过Condition来实现线程间的通信
 * 
 * @author 吖大哥
 * @date May 24, 2014 6:43:26 PM
 */
public class ThreeConditionTest {

	public static void main(String[] args) {
		final Business1 bs = new Business1();

		new Thread(new Runnable() {
			public void run() {
				for (int i = 0; i < 3; i++) {
					bs.sub1(i);
				}
			}
		}).start();

		new Thread(new Runnable() {
			public void run() {
				for (int i = 0; i < 3; i++) {
					bs.sub2(i);
				}
			}
		}).start();

		for (int i = 0; i < 3; i++) {
			bs.sub3(i);
		}
	}
}

class Business1 {

	private Lock lock = new ReentrantLock();
	private int flag = 1;
	private Condition c1 = lock.newCondition();
	private Condition c2 = lock.newCondition();
	private Condition c3 = lock.newCondition();

	public void sub1(int i) {
		lock.lock();
		try {
			while (flag != 1) {
				try {
					c1.await();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			for (int j = 0; j < 5; j++) {
				System.out.println("Sub1 第 " + i + " 次执行*****" + j);
			}
			flag = 2;
			c2.signal();
		} catch (RuntimeException e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}

	public void sub2(int i) {
		lock.lock();
		try {
			while (flag != 2) {
				try {
					c2.await();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			for (int j = 0; j < 5; j++) {
				System.out.println("Sub2 第 " + i + " 次执行*****" + j);
			}
			flag = 3;
			c3.signal();
		} catch (RuntimeException e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}

	public void sub3(int i) {
		lock.lock();
		try {
			while (flag != 3) {
				try {
					c3.await();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			for (int j = 0; j < 5; j++) {
				System.out.println("Sub3 第 " + i + " 次执行*****" + j);
			}
			flag = 1;
			c1.signal();
		} catch (RuntimeException e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}
}

 

执行结果:

Sub1 第 0 次执行*****0
Sub1 第 0 次执行*****1
Sub1 第 0 次执行*****2
Sub1 第 0 次执行*****3
Sub1 第 0 次执行*****4
Sub2 第 0 次执行*****0
Sub2 第 0 次执行*****1
Sub2 第 0 次执行*****2
Sub2 第 0 次执行*****3
Sub2 第 0 次执行*****4
Sub3 第 0 次执行*****0
Sub3 第 0 次执行*****1
Sub3 第 0 次执行*****2
Sub3 第 0 次执行*****3
Sub3 第 0 次执行*****4
Sub1 第 1 次执行*****0
Sub1 第 1 次执行*****1
Sub1 第 1 次执行*****2
Sub1 第 1 次执行*****3
Sub1 第 1 次执行*****4
Sub2 第 1 次执行*****0
Sub2 第 1 次执行*****1
Sub2 第 1 次执行*****2
Sub2 第 1 次执行*****3
Sub2 第 1 次执行*****4
Sub3 第 1 次执行*****0
Sub3 第 1 次执行*****1
Sub3 第 1 次执行*****2
Sub3 第 1 次执行*****3
Sub3 第 1 次执行*****4
Sub1 第 2 次执行*****0
Sub1 第 2 次执行*****1
Sub1 第 2 次执行*****2
Sub1 第 2 次执行*****3
Sub1 第 2 次执行*****4
Sub2 第 2 次执行*****0
Sub2 第 2 次执行*****1
Sub2 第 2 次执行*****2
Sub2 第 2 次执行*****3
Sub2 第 2 次执行*****4
Sub3 第 2 次执行*****0
Sub3 第 2 次执行*****1
Sub3 第 2 次执行*****2
Sub3 第 2 次执行*****3
Sub3 第 2 次执行*****4

 

执行过程分析:



 

 

  • 大小: 49 KB
分享到:
评论

相关推荐

    多线程之间的线程通信

    首先,线程通信是指在一个进程中,不同的线程之间共享数据和协调执行顺序的过程。这种通信通常涉及两个主要方面:同步和互斥。同步是为了保证特定的执行顺序,比如确保线程A完成任务后再启动线程B;互斥则是为了防止...

    进程与线程--小练习

    在一个进程中可以有多个线程并发执行,这些线程共享同一块内存空间,因此它们之间的通信更加高效。线程间的通信通常是通过共享内存或者互斥锁、信号量等同步原语来实现的。线程的创建、销毁和切换相比进程更快速,...

    Linux系统编程-(pthread)线程通信(条件变量).pdf

    在多线程编程中,线程间的通信是非常重要的,条件变量(Condition Variables)是POSIX线程(pthread)库提供的一种同步机制,它允许线程在特定条件满足时才能继续执行。在Linux系统编程中,条件变量通常与互斥锁...

    进程线程通信,线程同步,异步,进程通信经典进程间通信.7z

    常见的线程同步方法包括互斥锁(Mutex)、信号量(Semaphore)、条件变量(Condition Variable)等。例如,互斥锁确保同一时间只有一个线程可以访问资源,防止数据竞争。 **异步**和**同步**是两种不同的执行模式。...

    Java的多线程-线程间的通信.doc

    在Java多线程编程中,线程间的通信是非常重要的概念,用于协调多个并发执行的任务。线程的状态转换是理解线程通信的基础,主要包括四个状态:新(New)、可执行(Runnable)、死亡(Dead)和停滞(Blocked)。新状态...

    用成员变量进行线程通信.rar_线程通信

    线程通信是多线程编程中的一个重要概念,它是指在并发执行的多个线程之间交换信息的方式。在Java等编程语言中,线程通信通常用于解决共享数据的问题,确保线程间的协作和同步,防止数据竞争和死锁等问题。本资料“用...

    condition-circle-源码.rar

    总结来说,“condition-circle-源码”是一个涉及到条件控制和循环逻辑的程序模块,通过解压并分析源码,我们可以学习到如何在实际项目中灵活运用这些基本编程概念,提升我们的编程技能。对于初学者,这是一次绝佳的...

    图书管理线程通信问题

    线程通信指的是不同线程之间交换信息或同步执行的过程,以确保数据的一致性和程序的正确运行。本篇文章将深入探讨线程通信的重要性、原理以及在图书管理系统中的应用。 线程通信的主要目标是解决共享资源的问题,...

    Java多线程之ReentrantLock与Condition - 平凡希 - 博客园1

    `ReentrantLock`提供了一种可选的公平策略,即线程按照请求锁的顺序进行,而非公平策略则允许线程抢占锁,即使它们不是最早的等待者。 ### 2. ReentrantLock函数列表 `ReentrantLock`类提供了一系列方法来控制锁的...

    Java线程间的通信----生产者消费者模型

    生产者消费者模型是一种经典的线程同步问题,它模拟了实际生活中的生产过程和消费过程,使得生产者线程可以将数据生产出来,而消费者线程则负责消耗这些数据,两者之间通过共享数据结构进行协同工作。 生产者消费者...

    Java 线程通信示例 源代码

    在Java编程中,多线程通信是一个至关重要的概念,特别是在设计高效的并发应用程序时。这个"Java线程通信示例源代码"很可能包含了演示如何在不同线程之间共享数据和协调执行顺序的实例。线程通信主要涉及两个核心概念...

    vc线程通信实现计时器

    在VC++编程环境中,线程通信是多线程应用程序中不可或缺的一部分,特别是在需要同步或定时操作的场景下。本文将深入探讨如何利用VC++实现线程间的通信,并以计时器为例来阐述这一过程。 首先,理解线程通信的基本...

    线程通信(Condition) 实例

    线程通信(Condition)实例,完整的代码文件,你只需要编译运行即可,就可以看看结果,然后分析。

    C++实现多线程通信

    在C++编程中,多线程通信是并发执行任务时必不可少的一个环节,它涉及到线程间的同步和数据共享。在本篇文章中,我们将深入探讨如何在C++中实现多线程通信,以及相关的同步机制和数据交换策略。 一、线程创建与管理...

    创建线程及线程间通信

    本话题将深入探讨如何创建线程以及线程间如何进行通信,特别是通过互斥信号量实现线程的互斥访问。 首先,我们要理解什么是线程。线程是操作系统分配处理器时间的基本单位,它是进程内的执行单元。在同一个进程中,...

    操作系统中多线程之间通信

    操作系统中的多线程通信是并发编程中的核心概念,它允许不同的执行线程在共享资源时进行协调和数据交换。在本文中,我们将深入探讨多线程通信的重要性、常见方法以及如何解决经典的问题——读者写者问题。 首先,多...

    使用全局对象进行线程间的通信

    4. **条件变量(Condition Variable)**:在C++11标准中引入,允许线程等待某个条件满足后再继续执行,常与互斥锁结合使用。 5. **消息队列(Message Queue)**:线程通过发送和接收消息来通信,适合异步和顺序执行的...

    Linux多线程-相关手写笔记

    3. **条件变量(Condition Variables)**:条件变量用于线程间的同步,线程可以在满足特定条件时才继续执行。`pthread_cond_init()`、`pthread_cond_wait()`和`pthread_cond_signal()`/`pthread_cond_broadcast()`是...

    Java多线程-线程间的通信

    ### Java多线程—线程间的通信 #### 一、线程间的通信 ##### (1)为什么要处理线程间的通信? 在多线程环境中,不同的线程可能需要协同工作来完成一项任务。例如,一个线程负责生产数据,另一个线程负责消费这些...

    【个人总结系列-27】Python网络编程与多线程编程-学习总结.docx

    - `Condition`对象允许线程等待特定条件满足后再继续执行。 - `Event`对象用于线程间简单的信号传递。 在Python中,由于全局解释器锁(GIL)的存在,多线程在CPU密集型任务上可能无法充分利用多核优势,但在IO密集...

Global site tag (gtag.js) - Google Analytics