`

java condition的其他方法

阅读更多
//awaitNanos方法是用于在给定毫秒值内沉睡,超出时间或者被唤醒则醒过来。
//和await大部分方法一样,只是在内部多维护了一个毫秒值的时间。
public final long awaitNanos(long nanosTimeout)
                throws InterruptedException {
            if (Thread.interrupted())
                throw new InterruptedException();
            Node node = addConditionWaiter();
            int savedState = fullyRelease(node);
            long lastTime = System.nanoTime();
            int interruptMode = 0;
            while (!isOnSyncQueue(node)) {
	        //如果等待时间<0
                if (nanosTimeout <= 0L) {
		   //加入sync队列
                    transferAfterCancelledWait(node);
                    break;
                }
                LockSupport.parkNanos(this, nanosTimeout);
                if ((interruptMode = checkInterruptWhileWaiting(node)) != 0)
                    break;

                long now = System.nanoTime();
                nanosTimeout -= now - lastTime;
                lastTime = now;
            }
            if (acquireQueued(node, savedState) && interruptMode != THROW_IE)
                interruptMode = REINTERRUPT;
            if (node.nextWaiter != null)
                unlinkCancelledWaiters();
            if (interruptMode != 0)
                reportInterruptAfterWait(interruptMode);
            return nanosTimeout - (System.nanoTime() - lastTime);
        }


//在到达传入的时间前或者接到唤醒信号前阻塞线程。
 public final boolean awaitUntil(Date deadline)
                throws InterruptedException {
            if (deadline == null)
                throw new NullPointerException();
            long abstime = deadline.getTime();
            if (Thread.interrupted())
                throw new InterruptedException();
            Node node = addConditionWaiter();
            int savedState = fullyRelease(node);
            boolean timedout = false;
            int interruptMode = 0;
            while (!isOnSyncQueue(node)) {
	      //时间大于沉睡时间就移入队列等待唤醒
                if (System.currentTimeMillis() > abstime) {
                    timedout = transferAfterCancelledWait(node);
                    break;
                }
		//沉睡一直到abstime
                LockSupport.parkUntil(this, abstime);
                if ((interruptMode = checkInterruptWhileWaiting(node)) != 0)
                    break;
            }
            if (acquireQueued(node, savedState) && interruptMode != THROW_IE)
                interruptMode = REINTERRUPT;
            if (node.nextWaiter != null)
                unlinkCancelledWaiters();
            if (interruptMode != 0)
                reportInterruptAfterWait(interruptMode);
            return !timedout;
        }

//这个方法和awaitNanos基本一样。
 public final boolean await(long time, TimeUnit unit)
                throws InterruptedException {
            if (unit == null)
                throw new NullPointerException();
            long nanosTimeout = unit.toNanos(time);
            if (Thread.interrupted())
                throw new InterruptedException();
            Node node = addConditionWaiter();
            int savedState = fullyRelease(node);
            long lastTime = System.nanoTime();
            boolean timedout = false;
            int interruptMode = 0;
            while (!isOnSyncQueue(node)) {
                if (nanosTimeout <= 0L) {
                    timedout = transferAfterCancelledWait(node);
                    break;
                }
                if (nanosTimeout >= spinForTimeoutThreshold)
                    LockSupport.parkNanos(this, nanosTimeout);
                if ((interruptMode = checkInterruptWhileWaiting(node)) != 0)
                    break;
                long now = System.nanoTime();
                nanosTimeout -= now - lastTime;
                lastTime = now;
            }
            if (acquireQueued(node, savedState) && interruptMode != THROW_IE)
                interruptMode = REINTERRUPT;
            if (node.nextWaiter != null)
                unlinkCancelledWaiters();
            if (interruptMode != 0)
                reportInterruptAfterWait(interruptMode);
            return !timedout;
        }

//增加了该线程对于中断的响应。
public final void awaitUninterruptibly() {
            Node node = addConditionWaiter();
            int savedState = fullyRelease(node);
            boolean interrupted = false;
            while (!isOnSyncQueue(node)) {
                LockSupport.park(this);
                if (Thread.interrupted())
                    interrupted = true;
            }
            if (acquireQueued(node, savedState) || interrupted)
                selfInterrupt();
        }

//这个方法为将所有condition队列上的线程放入到sync队列中
   public final void signalAll() {
            if (!isHeldExclusively())
                throw new IllegalMonitorStateException();
            Node first = firstWaiter;
            if (first != null)
                doSignalAll(first);
        }

     private void doSignalAll(Node first) {
            lastWaiter = firstWaiter = null;
            do {
                Node next = first.nextWaiter;
                first.nextWaiter = null;
                transferForSignal(first);
                first = next;
            } while (first != null);
        }

final boolean transferForSignal(Node node) {
        /*
         * If cannot change waitStatus, the node has been cancelled.
         */
        if (!compareAndSetWaitStatus(node, Node.CONDITION, 0))
            return false;

        /*
         * Splice onto queue and try to set waitStatus of predecessor to
         * indicate that thread is (probably) waiting. If cancelled or
         * attempt to set waitStatus fails, wake up to resync (in which
         * case the waitStatus can be transiently and harmlessly wrong).
         */
        Node p = enq(node);
        int ws = p.waitStatus;
        if (ws > 0 || !compareAndSetWaitStatus(p, ws, Node.SIGNAL))
            LockSupport.unpark(node.thread);
        return true;
    }


分享到:
评论

相关推荐

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

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

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

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

    JavaLock与Condition的理解Reentran

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

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

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

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

    2. 等待操作:使用 Condition 的 await() 方法可以让当前线程等待,直到其他线程调用该 Condition 的 signal() 方法或 signalAll() 方法来唤醒该线程。await() 方法有多个变体,例如 awaitNanos(long nanosTimeout)...

    java中的Lock类和Condition类.docx

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

    Java条件变量的深度应用:使用Condition接口实现同步等待

    本文将详细介绍Condition接口的工作原理、使用方法以及如何在实际项目中应用它。 Condition接口是Java并发编程中实现等待/通知模式的重要工具。它提供了灵活的等待/通知机制,允许线程在特定条件不满足时挂起,并在...

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

    - `void await() throws InterruptedException`: 当前线程在调用此方法后会被放入等待队列,直到其他线程调用对应的`signal()`或`signalAll()`方法,或者当前线程被中断,才会返回。如果线程在等待期间被中断,会抛...

    Java并发编程之Condition源码分析(推荐)

    Java并发编程之Condition源码分析 Condition是Java并发编程中的一种同步机制,用于实现异步通信的同步。Condition主要有两个方法:await()和signal()。await()方法可以阻塞当前线程,并释放锁,而signal()方法可以...

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

    Condition接口是Java并发包java.util.concurrent.locks的一部分,它允许我们创建特定于锁的等待集合。相比于Object的监视器方法,Condition提供了更大的灵活性,可以为每个Lock创建多个Condition实例,从而更好地...

    java实现js中eval功能

    然而,`Nashorn`引擎在Java 11中已被弃用,因此在更现代的Java版本中,你可能需要寻找其他解决方案,如使用`GraalVM`的JavaScript引擎。 另外,如果我们要实现类似`eval`的字符串计算功能,但不涉及完整的...

    Java多线程中ReentrantLock与Condition详解

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

    java中类方法的控制结构

    在Java编程语言中,类方法的控制结构是构建程序逻辑的关键元素。这些结构决定了代码的执行顺序,使得程序能够根据不同的条件和循环条件执行特定的操作。以下是对标题和描述中涉及知识点的详细说明: 1. **顺序结构*...

    MyBatisPlus条件构造器Condition的用法示例代码

    下面我们将详细介绍`Condition`类的使用方法,并通过示例代码来展示其功能。 首先,`Condition`类是`com.baomidou.mybatisplus.core.conditions`包下的核心类,它主要用于构建复杂的查询条件。在实际开发中,我们...

    java 连数据库方法

    Java 连接数据库的方法主要涉及Java Database Connectivity (JDBC),它是Java编程语言中用来规范客户端程序如何访问数据库的应用程序接口,提供了诸如连接数据库、发送SQL语句、处理结果集等功能。JDBC是J2SE的一...

    Java的算数方法.docx

    在Java编程语言中,算数方法是用于执行基本数学运算的核心组成部分。这些方法包括加法、减法、乘法、除法...在实际编程中,这些方法常常与其他语言结构(如条件语句、循环和数组)结合使用,以解决更复杂的计算问题。

    Java并发之条件阻塞Condition的应用代码示例

    Java并发之条件阻塞Condition是Java并发编程中的一种高级同步机制,它允许线程在某个条件下等待或唤醒其他线程。Condition将Object监视器方法(wait、notify和notifyAll)分解成截然不同的对象,以便通过将这些对象...

    Android JNI多线程编程回调JAVA函数

    在Android开发中,JNI(Java Native Interface)是一个关键的技术,它允许Java代码和其他语言写的代码进行交互。JNI在处理性能敏感的任务,如图形渲染、硬件访问或者与C/C++库集成时,尤其有用。本话题将深入探讨如何...

    广药java考试题目

    根据给定的文件内容,我们可以总结出以下几个重要的Java知识点: ### 1.... 接口可以继承其他接口,但接口中的方法默认是抽象的,不能有方法体。 - D. 接口中不能有方法体。 因此,正确答案是D。

Global site tag (gtag.js) - Google Analytics