`

java condition 实例

阅读更多

condition是锁的一个实例,他可以与ReentrantLock结合使用,取代jdk自行操作的synchronize,自己控制锁的条件。

以下是使用实例:

 

 

package dirk.condition;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class BoundedBuffer {  
    // 可重入的互斥锁  
    final Lock lock = new ReentrantLock();  
    // 表示"缓冲区没满"条件  
    final Condition notFull = lock.newCondition();  
    // 表示"缓冲区非空"条件  
    final Condition notEmpty = lock.newCondition();   
    // 存储空间  
    //final Object[] items = new Object[100];   
    final ArrayList<Object> list = new ArrayList<Object>();
    final Queue<Object> queue = new LinkedList<Object>();
    final int maxSize = 10;
    int putptr, takeptr, count;  
  
    public void put(Object x) throws InterruptedException {  
   
        lock.lock();  
        try {  
            while (count == maxSize)  
                notFull.await(); 
            queue.offer(x);
            ++count;  
              
            notEmpty.signal();  
        } finally {  
            lock.unlock();  
        }  
    }  
  
    public Object take() throws InterruptedException {  
        lock.lock();  
        try {  
            while (count == 0)  
                notEmpty.await();
            Object x = queue.poll();
            --count;  
            notFull.signal();  
            return x;  
        } finally {  
            lock.unlock();  
        }  
    }  
  
    public static void main(String[] args) {  
        int threadCount = 5;  
      
        BoundedBuffer b = new BoundedBuffer();  
                  
          
        for(int i=0;i<threadCount;i++)  
        {  
            if(i%2 == 0)  
                new PutThread(b).start();  
            new TakeThread(b).start();  
        }  
  
    } 
    
    public static class PutThread extends Thread  
    {  
        private final BoundedBuffer b;  
        private int put = 0;  
          
        public PutThread(BoundedBuffer b)  
        {  
            this.b = b;  
        }  
        @Override  
        public void run() {  
            try {  
                String data = null;  
                while(true)  
                {     
                    data = "data" + (++put);  
                    System.out.println(data);  
                    b.put(data);      
                    Thread.sleep(100);  
                }  
            } catch (InterruptedException e) {  
                //e.printStackTrace();  
                Thread.currentThread().interrupt();               
            }  
        }  
    }  
      
    public static class TakeThread extends Thread  
    {  
        private final BoundedBuffer b;  
          
        public TakeThread(BoundedBuffer b)  
        {  
            this.b = b;  
        }  
        @Override  
        public void run() {  
            try {  
                while(true)  
                {                     
                        System.out.println(b.take());                     
                }  
            } catch (InterruptedException e) {  
                //e.printStackTrace();  
                Thread.currentThread().interrupt();               
            }  
        }  
    }  
}
分享到:
评论

相关推荐

    java JDK 实例开发宝典

    Java JDK实例开发宝典是一本专注于Java开发实践的书籍,主要涵盖了JDK中的核心特性和常见工具的使用方法。在本书中,读者可以找到一系列精心设计的实例,旨在帮助开发者深入理解和熟练应用Java语言。以下是对书中...

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

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

    Java JDK实例宝典

    全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...

    Java concurrency之Condition条件_动力节点Java学院整理

    在Java并发编程中,`Condition`接口是Java并发包(java.util.concurrent)中的一个重要组成部分,它提供了比`synchronized`关键字更为精细的线程同步和唤醒机制。`Condition`允许我们创建多个独立的等待队列,每个...

    JavaLock与Condition的理解Reentran

    每个Lock对象都可以创建多个Condition实例,每个Condition对应一个单独的等待队列。 1. await():使当前线程等待,直到被其他线程唤醒或被中断。线程被唤醒后,需要重新获取锁才能继续执行。 2. signal():唤醒一个...

    Java讲义与实例

    这份"Java讲义与实例"涵盖了从基础到高级的Java编程知识,旨在帮助学习者全面理解和掌握Java技术。 讲义可能包括以下几个核心部分: 1. **Java基础**:讲解Java语言的基本语法,如变量、数据类型、运算符、流程...

    Java异常分装实例

    在给定的“Java异常分装实例”中,我们可以学习如何创建自定义异常类、抛出和捕获异常,以及如何利用Java的异常层次结构。`exception_test`文件可能包含了一个或多个示例代码,用于演示这些概念。 首先,创建自定义...

    java_JDK_实例开发宝典

    通过实例,读者可以学习如何创建和管理线程,理解线程同步和通信的概念,如synchronized关键字、wait()和notify()方法,以及Lock接口和Condition类的使用。 5. **网络编程**:Java的Socket编程允许开发者创建网络...

    java多线程编程实例 (源程序)

    Java多线程编程是Java开发中的重要组成部分,它允许...提供的源程序文件可以作为学习和调试的实例,帮助你更好地理解和掌握这些概念。在实际开发中,理解并熟练运用这些技术,能有效提高代码的并发性能,提升系统效率。

    哲学家就餐:Java多线程实例图形版源代码学习

    在这个"哲学家就餐:Java多线程实例图形版源代码学习"中,开发者可能通过创建线程来模拟每个哲学家的行为,并用Java的synchronized关键字或者Lock接口来管理筷子(资源)的访问。这将帮助学习者深入理解Java的同步...

    java通信实例

    - **条件变量(Condition)**:Java 5引入了java.util.concurrent包,其中的Condition接口提供了比wait/notify更灵活的线程间通信方式。条件变量允许线程在特定条件下等待,并且可以在条件满足时被精确地唤醒。 - *...

    java中的Lock类和Condition类.docx

    - `newCondition()`: 创建一个新的Condition实例,可以用于实现线程间的精确通信。 3. **Condition类** - Condition接口允许我们创建和管理线程等待队列。每个Lock实例都可以创建一个或多个Condition实例,每个...

    Oracle 操作脚本精华(java操作实例)

    WHERE condition`用于更新,`DELETE FROM table WHERE condition`用于删除。 6. **PL/SQL块**:Oracle特有的PL/SQL语言允许编写更复杂的存储过程、函数和触发器,它们可以直接处理Blob数据,提供更高级的业务逻辑...

    java hibernate 实例

    Java Hibernate 是一个强大的对象关系映射(ORM)框架,它为Java开发者提供了便捷的数据持久化方式,使得在Java应用程序中操作数据库变得更加简单。本实例旨在介绍如何使用Hibernate进行基本的数据操作,包括自动...

    JAVA100例之实例54 使用语句预处理

    本文将深入探讨“JAVA100例之实例54 使用语句预处理”的核心概念,并通过实际案例解析如何在Java中有效地运用预处理语句。 预处理语句,通常指的是宏定义(#define)和条件编译(#if, #ifdef, #ifndef, #else, #...

    JAVA工程师实例参考手册1

    ### JAVA工程师实例参考手册1知识点概述 #### 一、基础程序练习 ##### 1. 古典兔子问题 **知识点**: - 斐波那契数列:一个经典的数学问题,涉及递归或循环实现。 - 递归算法:通过函数调用自身的方式解决问题的...

    java 中mongodb的各种操作查询的实例详解

    Java 中 MongoDB 的各种操作查询的实例详解 在 Java 中使用 MongoDB 时,需要掌握各种操作查询的方法,本文档将详细介绍 Java 中 MongoDB 的各种操作查询的实例详解。 查询一条数据 在实际应用中,我们经常需要...

    Java异步调用转同步方法实例详解

    Java异步调用转同步方法实例详解 Java异步调用转同步方法实例详解是指在Java中将异步调用转换为同步调用的技术,主要用于解决异步调用过程中的阻塞问题。异步调用是一种非阻塞的调用方式,调用方在调用过程中,不...

    java实例

    Java实例详解 在Java编程语言的世界里,实例是理论知识转化为实际操作的关键步骤。通过具体的实例,我们可以更好地理解和掌握Java的特性和用法。在这个"java实例"中,我们将深入探讨Java的基础概念、语法以及常见...

Global site tag (gtag.js) - Google Analytics