`

多线程之Condition

阅读更多

 

 jdk 官网对Condition的描述:

ConditionObject 监视器方法(waitnotifynotifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set (wait-set)。其中,Lock 替代了 synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法的使用。

 

下面通过网上一道面试题看看Condition的应用:

   启动三个线程,顺序打印ABC十次

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

public class PrintABC {
	Lock lock = new ReentrantLock();
	Condition aCdt = lock.newCondition();
	Condition bCdt = lock.newCondition();
	Condition cCdt = lock.newCondition();
	int order = 0;
	public static void main(String[] args) {
		final PrintABC print = new PrintABC();
		ExecutorService executorService = Executors.newFixedThreadPool(3);
		for (int i = 0; i < 10; i++) {
			executorService.execute(new Runnable() {
				@Override
				public void run() {
					print.printA();
				}
			});
			executorService.execute(new Runnable() {
				@Override
				public void run() {
					print.printB();
				}
			});
			executorService.execute(new Runnable() {
				@Override
				public void run() {
					print.printC();
				}
			});

		}
		executorService.shutdown();
	}

	public void printA() {
		try {
			lock.lock();
			while (order != 0) {
				aCdt.await();
			}
			System.out.println("A");
			order = 1;
			bCdt.signal();

		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}

	public void printB() {

		try {
			lock.lock();
			while (order != 1)
				bCdt.await();
			System.out.println("B");
			order = 2;
			cCdt.signal();

		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}

	public void printC() {

		try {
			lock.lock();
			while (order != 2)
				cCdt.await();
			System.out.println("C");
			order = 0;
			aCdt.signal();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}

}

 

分享到:
评论

相关推荐

    多线程的运用e语言多线程 e多线程

    在编程领域,多线程是一种重要的并发执行机制,它允许程序同时执行多个任务,从而提高系统资源利用率和程序响应速度。E语言(可能是错误输入或者是某个特定编程环境或语言的简称)中的多线程功能也不例外。本文将...

    Delphi多线程详解_delphi_delphi多线程_多线程_

    在编程领域,多线程是一种常见且强大的技术,它允许应用程序同时执行多个任务,从而提高程序的效率和响应性。Delphi,作为一个流行的Object Pascal开发环境,提供了丰富的工具和库来支持多线程编程。本篇文章将深入...

    c++多线程编程的十个例子

    在C++编程中,多线程技术是一种强大的工具,它允许程序同时执行多个任务,从而提高了效率和响应性。以下是对“C++多线程编程的十个例子”的详细讲解,这些例子将帮助你在Windows环境下深入理解和应用多线程。 1. **...

    Linux系统下的多线程编程入门.pdf

    在Linux系统下进行多线程编程是开发高效并发应用程序的关键技术之一。本文将深入探讨Linux环境中的多线程概念、创建与管理线程的方法、线程同步与通信机制,以及多线程编程中可能遇到的问题和解决策略。 一、多线程...

    多线程例子 演示多线程使用

    在计算机编程中,多线程是一种并发执行任务的技术,它允许多个子任务在同一时间运行,从而提高了程序的效率和响应性。这个“多线程例子”演示了如何在C++环境中实现多线程功能。下面我们将深入探讨多线程的基本概念...

    线程并发控制condition互斥量 多线程写的:生产者、消费者问题

    线程并发控制condition 互斥量 多线程写的:生产者、消费者问题

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

    Java中的`ReentrantLock`是Java并发包`java.util.concurrent.locks`中的一个高级锁机制,它是可重入的互斥锁,具有与`synchronized`关键字...在设计和实现多线程程序时,了解和正确使用`ReentrantLock`是非常重要的。

    多线程编程之一 介绍+例程

    标题“多线程编程之一 介绍+例程”暗示我们将从基础出发,逐步揭示多线程编程的核心原理,并通过实际的代码示例来辅助理解。 首先,我们需要了解什么是多线程编程。在单线程环境中,程序按照顺序执行任务。而在多...

    C++ 多线程求PI

    在C++编程中,多线程技术是一种提升程序性能的有效方式,特别是在计算密集型任务中,如求解圆周率(PI)。这个项目名为“C++ 多线程求PI”,其目标是利用多线程并行计算来提高求解PI的效率。Word文档中的思路可能...

    多线程同步解决卖票问题

    多线程同步解决卖票问题

    多线程测试代码多线程测试代码

    在IT领域,多线程是一种重要的编程概念,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Windows环境下,有多种实现多线程的方法,包括使用Win32 API以及C运行时库(CRT)和C++11标准库。本篇文章...

    CC++多线程编程练习题大全

    **CC++多线程编程**是现代软件开发中的重要组成部分,尤其在高性能计算、服务器端应用和实时系统中,多线程技术能充分利用多核处理器的资源,提高程序的执行效率。以下是一些关于CC++多线程编程的核心知识点: 1. *...

    多线程学习汇总资料,多线程学习汇总资料,

    多线程是计算机编程中的一个核心概念,尤其是在Java、C++等高级编程语言中,它被广泛用于提高程序的执行效率。本汇总资料主要聚焦于多线程的学习,旨在帮助开发者深入理解并熟练掌握这一技术。 多线程是指在单个...

    vc多线程编程简单介绍vc多线程编程简单介绍vc多线程编程简单介绍

    在Windows平台上,Visual C++(简称VC)是微软公司提供的一种强大的C++开发工具,它支持多线程编程,使得开发者能够创建同时执行多个任务的应用程序。多线程编程是现代软件开发中的一个重要概念,特别是在处理大数据...

    linux多线程编程.pdf

    Linux多线程编程是现代操作系统编程的重要组成部分,尤其是在Linux环境下,多线程编程更是成为了高性能应用不可或缺的技术之一。本文档主要涉及Linux多线程编程的一些关键知识点,包括pthread线程库的使用、线程的...

    多线程操作_paintawe_多线程写入例程_

    在多线程环境下,同步是非常关键的,比如使用互斥量(mutex)或条件变量(condition variable)来确保对共享资源的正确访问。 "说明文档.docx"可能会详细解释这段代码的工作原理、如何编译和运行,以及可能遇到的...

    现代多线程 JAVA和c++多线程实现 测试和调试

    在现代软件开发中,多线程技术已经成为必不可少的一部分,特别是在JAVA和C++这样的高级编程语言中。多线程允许程序同时执行多个任务,提高应用程序的响应性和效率。本资源主要探讨了如何在JAVA和C++中实现多线程,...

    多线程和网络编程

    在IT领域,多线程和网络编程是两个关键的概念,它们在构建高性能、高并发的系统中发挥着至关重要的作用。 多线程是指在一个进程中同时执行多个线程,每个线程独立地执行任务,共享同一内存空间。这种设计模式允许...

    Win32多线程程序设计全部代码

    在Windows平台上进行软件开发时,Win32 API是不可或缺的一部分,尤其在涉及到多线程编程时。本资源“Win32多线程程序设计全部代码”提供了完整的源代码示例,帮助开发者深入理解和实践如何在Win32环境下创建和管理多...

Global site tag (gtag.js) - Google Analytics