`

Condition实现线程通信

 
阅读更多
在等待 Condition 时,允许发生“虚假唤醒”,这通常作为对基础平台语义的让步。对于大多数应用程序,这带来的实际影响很小,因为 Condition 应该总是在一个循环中被等待,并测试正被等待的状态声明。某个实现可以随意移除可能的虚假唤醒,但建议应用程序程序员总是假定这些虚假唤醒可能发生,因此总是在一个循环中等待。

一个锁内部可以有多个Condition,即有多路等待和通知,可以参看jdk1.5提供的LockCondition实现的可阻塞队列的应用案例,从中除了要体味算法,还要体味面向对象的封装。在传统的线程机制中一个监视器对象上只能有一路等待和通知,要想实现多路等待和通知,必须嵌套使用多个同步监视器对象。(如果只用一个Condition,两个放的都在等,一旦一个放的进去了,那么它通知可能会导致另一个放接着往下走。)

 

public static void main(String[] args) {
  
  final Business business = new Business();
  new Thread(
    new Runnable() {
     
     @Override
     public void run() {
     
      for(int i=1;i<=50;i++){
       business.sub(i);
      }
      
     }
    }
  ).start();
  
  for(int i=1;i<=50;i++){
   business.main(i);
  }
  
 }

 static class Business {
   Lock lock = new ReentrantLock();
   Condition condition = lock.newCondition();
    private boolean bShouldSub = true;
    public  void sub(int i){
     lock.lock();
     try{
      while(!bShouldSub){
       try {
      condition.await();
     } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
      }
     for(int j=1;j<=10;j++){
      System.out.println("sub thread sequence of " + j + ",loop of " + i);
     }
      bShouldSub = false;
      condition.signal();
     }finally{
      lock.unlock();
     }
    }
   
    public  void main(int i){
     lock.lock();
     try{
     while(bShouldSub){
        try {
       condition.await();
      } catch (Exception e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
       }
     for(int j=1;j<=100;j++){
      System.out.println("main thread sequence of " + j + ",loop of " + i);
     }
     bShouldSub = true;
     condition.signal();
    }finally{
     lock.unlock();
    }
   }
 
 }

 

 

public static void main(String[] args) {
  
  final Business business = new Business();
  new Thread(
    new Runnable() {
     
     @Override
     public void run() {
     
      for(int i=1;i<=50;i++){
       business.sub2(i);
      }
      
     }
    }
  ).start();
  
  new Thread(
    new Runnable() {
     
     @Override
     public void run() {
     
      for(int i=1;i<=50;i++){
       business.sub3(i);
      }
      
     }
    }
  ).start();  
  
  for(int i=1;i<=50;i++){
   business.main(i);
  }
  
 }

 static class Business {
   Lock lock = new ReentrantLock();
   Condition condition1 = lock.newCondition();
   Condition condition2 = lock.newCondition();
   Condition condition3 = lock.newCondition();
    private int shouldSub = 1;
    public  void sub2(int i){
     lock.lock();
     try{
      while(shouldSub != 2){
       try {
      condition2.await();
     } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
      }
     for(int j=1;j<=10;j++){
      System.out.println("sub2 thread sequence of " + j + ",loop of " + i);
     }
      shouldSub = 3;
      condition3.signal();
     }finally{
      lock.unlock();
     }
    }

    public  void sub3(int i){
     lock.lock();
     try{
      while(shouldSub != 3){
       try {
      condition3.await();
     } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
      }
     for(int j=1;j<=20;j++){
      System.out.println("sub3 thread sequence of " + j + ",loop of " + i);
     }
      shouldSub = 1;
      condition1.signal();
     }finally{
      lock.unlock();
     }
    }   
   
    public  void main(int i){
     lock.lock();
     try{
     while(shouldSub != 1){
        try {
       condition1.await();
      } catch (Exception e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
       }
     for(int j=1;j<=100;j++){
      System.out.println("main thread sequence of " + j + ",loop of " + i);
     }
     shouldSub = 2;
     condition2.signal();
    }finally{
     lock.unlock();
    }
   }
 
 }

分享到:
评论

相关推荐

    Java编程中实现Condition控制线程通信

    下面是一个使用Condition实现线程通信的简单例子。在这个例子中,我们有一个Account类,用于模拟银行账户的存取款操作。Account类包含了ReentrantLock和Condition实例,用于同步和控制线程的执行: ```java public ...

    Python线程协作threading.Condition实现过程解析

    在Python的多线程编程中,`threading.Condition`是一个重要的工具,用于实现线程间的协作和同步。本文将深入解析`threading.Condition`的工作原理和实现过程,并通过一个简单的男女对话示例来阐述其使用方法。 `...

    多线程之间的线程通信

    3. **条件变量(Condition Variable)**:线程可以等待某个特定条件满足后才继续执行,这通常与锁结合使用,用于实现线程间的协作。 4. **管道(Pipe)**和**套接字(Socket)**:这些是进程间通信(IPC)的方法,也可以...

    Java使用Condition控制线程通信的方法实例详解

    Java 使用 Condition 控制线程通信的方法实例详解 Java 中,Condition 类是 Lock 接口的一个补充,它提供了一种机制来让线程等待某个条件的满足,然后继续执行。Condition 将同步监视锁方法(wait、notify 和 ...

    C++实现多线程通信

    在本篇文章中,我们将深入探讨如何在C++中实现多线程通信,以及相关的同步机制和数据交换策略。 一、线程创建与管理 在C++11及以后的标准中,C++提供了`std::thread`库来支持线程的创建和管理。创建一个新线程可以...

    vc线程通信实现计时器

    在VC++中,我们通常使用以下几种方法实现线程通信: 1. **事件对象**:如Windows的`CreateEvent`函数创建的事件,线程可以通过等待事件来同步执行。计时器功能可以通过设置事件来触发,当时间到达预设值时,计时器...

    Python快速而美丽[v1.0.0][线程通信]

    使用Condition实现线程通信 使用Condition可以让那些已经得到Lock对象却无法继续执行的线程释放Lock对象,Condition对象也可以唤醒其他处于等待状态的线程 将Condition和Lock对象组合使用,可以为每个对象提供多个...

    Java 线程通信示例 源代码

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

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

    本资料“用成员变量进行线程通信.rar”似乎提供了一个实例,探讨如何利用类的成员变量实现线程间的通信。 线程是操作系统分配给处理器的基本执行单元,每个线程都有自己的独立堆栈,存储局部变量和方法调用信息。这...

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

    在计算机科学中,进程线程通信、线程同步与异步以及进程间的通信是操作系统核心概念,对于理解和优化多任务并行处理至关重要。这些概念在软件开发,尤其是并发编程领域中占据着举足轻重的地位。 首先,让我们来探讨...

    多线程实现基于TCP的Socket通信.rar

    本项目“多线程实现基于TCP的Socket通信”聚焦于在Windows环境下,如何利用C++编程语言通过多线程技术来实现高效、稳定的网络连接。下面将详细阐述涉及的知识点。 1. **TCP协议**:TCP是一种面向连接的、可靠的、...

    图书管理线程通信问题

    在IT领域,线程通信是多线程编程中的核心概念,特别是在复杂的系统设计中,如图书管理系统。线程通信指的是不同线程之间交换信息或同步执行的过程,以确保数据的一致性和程序的正确运行。本篇文章将深入探讨线程通信...

    C++ 多线程通信方式简介并结合生产者-消费者模式代码实现

    本文将深入探讨C++中的多线程通信方式,并结合经典的生产者-消费者模式来阐述其实现。 一、C++多线程基础 C++11引入了标准库`&lt;thread&gt;`,提供了对多线程的支持。创建线程的基本方法是通过`std::thread`类,如下所示...

    多线程_sometimelrz_examine9j3_多线程通信_

    本文将深入探讨多线程通信的概念、重要性以及实现方法。 首先,多线程是指在一个进程中同时运行多个线程,每个线程独立执行不同的任务。在客户端-服务器架构中,多线程通信通常指的是服务器端通过多个线程来处理...

    VC中利用多线程技术实现线程之间的通信

    7. **条件变量**:条件变量(`Condition Variable`)允许线程在满足特定条件时才继续执行,常与互斥量配合使用,实现线程的等待和唤醒。 在进行多线程编程时,必须谨慎处理线程同步和数据一致性问题,避免出现竞态...

    多线程技术实现线程之间的通信

    在线程通信中,同步是非常关键的一环,防止数据竞争和死锁的发生。死锁是指两个或多个线程互相等待对方释放资源,导致无法继续执行的情况。为了避免死锁,应遵循一定的设计原则,如避免循环等待,合理分配资源,使用...

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

    在操作系统中,有多种实现线程通信的方式: 1. **信号量(Semaphore)**:信号量是一种计数器,可以用于限制同时访问某个资源的线程数量。它可以是二进制信号量(只能取0或1,类似互斥锁)或计数信号量(可取大于1...

    Testserver_Linux.rar_Testserver_Linux_多线程通信

    一旦有新的连接,服务器就会创建一个新的线程来处理该连接,从而实现多线程通信。 在多线程处理客户端请求时,可能遇到的问题包括资源竞争、死锁以及线程安全。为避免这些问题,开发者需要确保共享资源的访问是同步...

    创建线程及线程间通信

    线程通信是线程协作完成任务的关键,它允许线程之间交换数据或同步操作。一种常见的通信机制是“生产者-消费者”模型,其中生产者线程生成数据,而消费者线程消费这些数据。在没有适当的同步机制下,可能会出现数据...

Global site tag (gtag.js) - Google Analytics