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

java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)

 
阅读更多

JDK1.5 的 java.util.concurrent.locks.ReentrantLock 锁,JDK也为我们提供了与此功能相应的类java.util.concurrent.locks.Condition。Condition与重入锁是通过lock.newCondition()方法产生一个与当前重入锁绑定的Condtion实例,我们通知该实例来控制线程的等待与通知。

package com.jalja.org.base.Thread;

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

/**
 * Condition 配合Lock  实现线程的等待 与通知
 */
public class ConditionTest{
    public static ReentrantLock lock=new ReentrantLock();
    public static Condition condition =lock.newCondition();
    public static void main(String[] args) {
        new Thread(){
            @Override
            public void run() {
                lock.lock();//请求锁
                try{
                    System.out.println(Thread.currentThread().getName()+"==》进入等待");
                    condition.await();//设置当前线程进入等待
                }catch (InterruptedException e) {
                    e.printStackTrace();
                }finally{
                    lock.unlock();//释放锁
                }
                System.out.println(Thread.currentThread().getName()+"==》继续执行");
            }    
        }.start();
        new Thread(){
            @Override
            public void run() {
                lock.lock();//请求锁
                try{
                    System.out.println(Thread.currentThread().getName()+"=》进入");
                    Thread.sleep(2000);//休息2秒
                    condition.signal();//随机唤醒等待队列中的一个线程
                    System.out.println(Thread.currentThread().getName()+"休息结束");
                }catch (InterruptedException e) {
                    e.printStackTrace();
                }finally{
                    lock.unlock();//释放锁
                }
            }    
        }.start();
    }
}

 

分享到:
评论

相关推荐

    Java学习资料-详解Condition的await和signal等待/通知机制

    `Condition`与`Lock`配合使用,能够实现更加精确的线程控制,具有更高的可控制性和扩展性。以下是关于`Condition`的`await()`和`signal()`等待/通知机制的详细解释: 1. **Condition简介** - `Condition`是`Lock`...

    Java线程中wait,await,sleep,yield,join用法总结.pdf

    在Java编程中,多线程的使用是实现程序并发运行的重要手段。本文将总结五个关键的线程控制方法:wait()、await()、sleep()、yield()和join()。这些方法各自有独特的用途和不同的工作机制。 一、wait()、notify()、...

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

    与`synchronized`的`wait()`和`notifyAll()`不同,`Condition`提供了`await()`和`signal()`方法,可以精确地唤醒一个或多个等待的线程。 - **可中断锁等待**:与`synchronized`不同,`ReentrantLock`的`...

    JavaLock与Condition的理解Reentran

    Java Lock与Condition是Java并发编程中的重要概念,它们提供了比synchronized关键字更细粒度的控制,从而使得多线程程序的设计和管理更加灵活高效。本文将深入探讨ReentrantLock(可重入锁)和Condition的基本原理、...

    java中的Lock类和Condition类.docx

    Java中的Lock类与Condition类是Java并发编程的重要组成部分,它们为多线程环境下的同步提供了更为灵活和强大的控制。在JDK 1.5及之后的版本中,Lock类作为替代synchronized关键字的一种方式出现,提供了更精细的锁...

    Java多线程中ReentrantLock与Condition详解

    ReentrantLock是Java多线程中一种高级的锁机制,它实现了Lock接口,提供了与synchronized相同的并发性和内存语义,但添加了一些特性,如锁投票、定时锁等候和可中断锁等候。ReentrantLock类的主要特点是可以重入,即...

    java 资源搜索并下载(线程等待和通报)

    本文将深入探讨如何使用Java进行资源搜索与下载,同时结合线程等待和通报机制来优化程序性能。 一、资源搜索 资源搜索通常涉及HTTP请求,通过URL连接到服务器,获取HTML或其他类型的数据,然后解析这些数据以找到所...

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

    Lock接口提供了lock(), unlock(), newCondition()等方法,Condition接口则提供了await(), signal()和signalAll()方法,类似于wait(), notify()和notifyAll()。 在实际开发中,正确使用这些线程通信机制可以避免数据...

    3.1.5.并发工具的使用以及原理1

    在 ConditionWait 中,我们可以使用 lock.lock() 方法获取锁,然后使用 condition.await() 方法使当前线程进入等待队列并释放锁,同时线程状态变为等待状态。当从 await() 方法返回时,当前线程一定获取了 Condition...

    Java并发编程(20)并发新特性-Lock锁和条件变量(

    在Java中,ReentrantLock(可重入锁)是Lock接口的主要实现,它支持公平锁和非公平锁策略。公平锁保证按照线程请求锁的顺序进行分配,而非公平锁则不保证这一点,但通常效率更高。 条件变量(Condition)是Lock的一...

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

    Condition 将同步监视锁方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与 Lock 对象组合使用,为每个对象提供多个等待集(wait-set)。 在 Java 中,使用 Condition 控制线程通信的...

    Java多线程编程中使用Condition类操作锁的方法详解

    总结来说,Java中的Condition类是线程间通信的一种高级工具,它与Lock配合使用,提供了更为强大的同步和等待机制。通过Condition,开发者可以实现更复杂、更安全的多线程程序,提高并发编程的效率和可控性。在实际...

    java 锁 Lock接口详解.docx

    `Condition`接口是与`Lock`相关的条件变量,它扩展了监视器的概念,允许线程在满足特定条件时等待,而不仅仅是等待锁的释放。一个`Lock`可以关联多个`Condition`对象,这样就可以根据不同的条件进行分组等待,提高了...

    多线程编程的核心思想.doc

    Condition 接口是 Lock 接口的补充,用于实现等待/通知机制。Condition 接口中的方法有 await()、awaitUntil(Date deadline)、awaitNanos(long nanosTimeout)、signal()和 signalAll()。 * await():使当前线程等待...

    java多线程系列(四)ReentrantLock的使用.docx

    `condition.await()`会将线程放入对应的等待队列,`condition.signal()`和`condition.signalAll()`则可以唤醒等待队列中的一个或所有线程。这与`Object`类的`wait()`、`notify()`和`notifyAll()`方法类似,但`...

    基于JDK源码解析Java领域中的并发锁之设计与实现.pdf

    当线程调用condition的await()方法时,会释放当前持有的锁,进入等待状态,直到其他线程调用signal()或signalAll()方法唤醒。 四、Lock接口的设计与实现 Lock接口提供了比synchronized关键字更灵活的锁操作,包括...

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

    Java中的Lock接口及其实现,如ReentrantLock,提供了更高级的线程通信机制,其中包括Condition接口。 Condition接口是Java并发包java.util.concurrent.locks的一部分,它允许我们创建特定于锁的等待集合。相比于...

    java多线程实现生产者和消费者

    `java.util.concurrent.locks.Condition` 接口与 `java.util.concurrent.locks.Lock` 接口一起使用,提供了比`synchronized`更细粒度的控制。Lock提供了获取和释放锁的方法,而Condition则允许线程等待特定条件并被...

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

    `condition.await()`使得`ThreadA`释放锁并进入等待,而`condition.signal()`则唤醒等待中的线程。 #### 示例3(高级功能) `Condition`还支持更复杂的操作,例如多个条件或条件链。你可以创建多个`Condition`实例...

Global site tag (gtag.js) - Google Analytics