`

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实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...

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

    主要介绍了Java使用Condition控制线程通信的方法,结合实例形式分析了使用Condition类同步检测控制线程通信的相关操作技巧,需要的朋友可以参考下

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

    主要介绍了Java编程中实现Condition控制线程通信,简单介绍了Java中控制线程通信的方法,以及对condition的解析和实例,具有一定参考价值,需要的朋友可以了解下。

    java多线程加锁以及Condition类的使用实例解析

    主要介绍了java多线程加锁以及Condition类的使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    11.2.1 lock、readwritelock与condition 349 11.2.2 使用executor 357 11.2.3 并行collection简介 370 11.3 重点复习 373 11.4 课后练习 375 chapter12 通用api 377 12.1 日志 378 12.1.1 日志api简介...

    Java 7并发编程实战手册

    全书通过60多个简单而非常有效的实例,帮助读者快速掌握Java 7多线程应用程序的开发技术。学习完本书,你可以将这些开发技术直接应用到自己的应用程序中。 《Java 7并发编程实战手册》适合具有一定Java编程基础的...

    Java SE实践教程 pdf格式电子书 下载(四) 更新

    内容简介:此书结合具体实例讲解,通俗易懂,又不乏深度。我觉得这本书写的确实不错,堪称经典,市面上这样的书实在太少了,所以在这里发布下,供大家共享。本书从编程技术、项目实践以及软件工程的角度出发,如果...

    Java SE实践教程 源代码 下载

    内容简介:此书结合具体实例讲解,通俗易懂,又不乏深度。我觉得这本书写的确实不错,堪称经典,市面上这样的书实在太少了,所以在这里发布下,供大家共享。本书从编程技术、项目实践以及软件工程的角度出发,如果...

    Java SE实践教程 pdf格式电子书 下载(一) 更新

    内容简介:此书结合具体实例讲解,通俗易懂,又不乏深度。我觉得这本书写的确实不错,堪称经典,市面上这样的书实在太少了,所以在这里发布下,供大家共享。本书从编程技术、项目实践以及软件工程的角度出发,如果...

    整理后java开发全套达内学习笔记(含练习)

    Annotation [java] 代码注释 [ænәu'teiʃәn] anonymous adj.匿名的[ә'nɒnimәs]'(反义:directly adv.直接地,立即[di'rektli, dai'rektli]) apply v.应用,适用 [ә'plai] application n.应用,应用程序 [,æ...

    Java并发编程实战

    14.3 显式的Condition对象251 14.4 Synchronizer剖析253 14.5 AbstractQueuedSynchronizer254 14.6 java.util.concurrent同步器类中的 AQS257 14.6.1 ReentrantLock257 14.6.2 Semaphore与CountDownLatch258 ...

    reactive-functional-java:受scala启发的Java中一些功能性React式代码的通用存储桶

    React功能的Java 受scala启发的Java功能/React性代码的通用存储桶,利用了Java 8给我们带来的好处。 ## Result Result对象不仅仅是一个简单的元组。 它被设计用来显式地向API使用者发出信号,即某种方法可能会产生...

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    Python中的True,False条件判断实例分析

    本文实例讲述了Python中的True,False条件判断用法。分享给大家供大家参考。具体分析如下: 对于有编程经验的程序员们都知道条件语句的写法: 以C++为例: 复制代码 代码如下:if (condition)  {   doSomething();...

    ajax+json+Struts2实现list传递实例讲解

    由于实习需要,需要通过ajax来获取后台的List集合里面的值。由于前面没有接触过,所以今天就来研究下... 1、身份证错误信息Bean类(ErrorCondition.java) 代码如下: /** *@Project: excel *@Author: chenssy *@Date: 20

    OOP_Car:通过模拟汽车来实践Java OOP原理的项目

    在Simulator的main()方法内,创建Car对象的实例,然后调用该对象的run()方法。 现在,您将创建其他类,它们代表汽车的不同组件-发动机,油箱,车轮等。这些类应具有与其行为相关的方法,并具有代表其各种状态的...

    Python三元运算实现方法

    本文实例讲述了Python三元运算实现方法。分享给大家供大家参考。具体分析如下: Python中没有像C++和Java等语言中的三元运算符,但是可以用if else语句实现相同的功能: 复制代码 代码如下:&gt;&gt;&gt; condition = True  &gt;...

    建立Selenium工程.docx

    本文将step by step的讲述第一个selenium实例: step1:下载selenium-remote-control.下载地址:http://www.openqa.org/selenium-rc/download.action step2:打开eclipse 新建java project. step3:将junit.jar,selenium-...

    高级开发并发面试题和答案.pdf

    synchronized关键字加在静态方法和实例方法的区别; 用锁的注意点; cas机制可能导致的问题ABA,什么是ABA; 程序开多少线程合适; 实现一下DCL(双重检查锁) stream 和 parallelStream区别; 实现一个阻塞队列(用...

    jbpm安装及使用方法

    一个Task instance(任务实例)可以被分配给一个actorId (java.lang.String)。所有的Task instance都被保存在数据库中的表jbpm_taskinstance里。当你想得到特定用户的任务清单时,你就可以通过一个与用户关联的...

Global site tag (gtag.js) - Google Analytics