Example usage for java.util.concurrent.locks LockSupport park

List of usage examples for java.util.concurrent.locks LockSupport park

Introduction

In this page you can find the example usage for java.util.concurrent.locks LockSupport park.

Prototype

public static void park(Object blocker) 

Source Link

Document

Disables the current thread for thread scheduling purposes unless the permit is available.

Usage

From source file:actor4j.core.DefaultActorThread.java

@Override
public void onRun() {
    boolean hasNextDirective;
    boolean hasNextPriority;
    int hasNextServer;
    int hasNextOuter;
    int hasNextInner;
    int idle = 0;

    while (!isInterrupted()) {
        hasNextDirective = false;//from w w w .  jav a  2  s .  c o m
        hasNextPriority = false;
        hasNextServer = 0;
        hasNextOuter = 0;
        hasNextInner = 0;

        while (poll(directiveQueue))
            hasNextDirective = true;

        while (poll(priorityQueue))
            hasNextPriority = true;

        if (system.serverMode) {
            for (; hasNextServer < system.throughput && poll(serverQueueL1); hasNextServer++)
                ;
            if (hasNextServer < system.throughput && serverQueueL2.peek() != null) {
                ActorMessage<?> message = null;
                for (int j = 0; j < system.getBufferQueueSize()
                        && (message = serverQueueL2.poll()) != null; j++)
                    serverQueueL1.offer(message);

                for (; hasNextServer < system.throughput && poll(serverQueueL1); hasNextServer++)
                    ;
            }
        }

        for (; hasNextOuter < system.throughput && poll(outerQueueL1); hasNextOuter++)
            ;
        if (hasNextOuter < system.throughput && outerQueueL2.peek() != null) {
            ActorMessage<?> message = null;
            for (int j = 0; j < system.getBufferQueueSize() && (message = outerQueueL2.poll()) != null; j++)
                outerQueueL1.offer(message);

            for (; hasNextOuter < system.throughput && poll(outerQueueL1); hasNextOuter++)
                ;
        }

        for (; hasNextInner < system.throughput && poll(innerQueue); hasNextInner++)
            ;

        if (hasNextInner == 0 && hasNextOuter == 0 && hasNextServer == 0 && !hasNextPriority
                && !hasNextDirective) {
            idle++;
            if (idle > system.idle) {
                idle = 0;
                if (system.threadMode == ActorThreadMode.PARK) {
                    if (newMessage.compareAndSet(true, false))
                        LockSupport.park(this);
                } else if (system.threadMode == ActorThreadMode.SLEEP) {
                    try {
                        sleep(system.sleepTime);
                    } catch (InterruptedException e) {
                        interrupt();
                    }
                } else
                    yield();
            }
        } else
            idle = 0;
    }
}

From source file:actor4j.core.XActorThread.java

@Override
public void onRun() {
    boolean hasNextDirective;
    boolean hasNextPriority;
    int hasNextServer;
    int hasNextOuter;
    int hasNextInner;
    int idle = 0;

    while (!isInterrupted()) {
        hasNextDirective = false;/*  w ww .  ja va 2s. c  o  m*/
        hasNextPriority = false;
        hasNextServer = 0;
        hasNextOuter = 0;
        hasNextInner = 0;

        while (poll(directiveQueue))
            hasNextDirective = true;

        while (poll(priorityQueue))
            hasNextPriority = true;

        if (system.clientMode) {
            for (; hasNextServer < system.throughput && poll(serverQueueL1); hasNextServer++)
                ;
            if (hasNextServer < system.throughput && serverQueueL2.peek() != null) {
                ActorMessage<?> message = null;
                for (int j = 0; j < system.getBufferQueueSize()
                        && (message = serverQueueL2.poll()) != null; j++)
                    serverQueueL1.offer(message);

                for (; hasNextServer < system.throughput && poll(serverQueueL1); hasNextServer++)
                    ;
            }
        }

        for (; hasNextOuter < system.throughput && poll(outerQueueL1); hasNextOuter++)
            ;
        if (hasNextOuter < system.throughput && outerQueueL2A.peek() != null) {
            ActorMessage<?> message = null;
            for (int j = 0; j < system.getBufferQueueSize() && (message = outerQueueL2A.poll()) != null; j++)
                outerQueueL1.offer(message);

            for (; hasNextOuter < system.throughput && poll(outerQueueL1); hasNextOuter++)
                ;
        }
        if (hasNextOuter < system.throughput && outerQueueL2B.peek() != null) {
            ActorMessage<?> message = null;
            for (int j = 0; j < system.getBufferQueueSize() && (message = outerQueueL2B.poll()) != null; j++)
                outerQueueL1.offer(message);

            for (; hasNextOuter < system.throughput && poll(outerQueueL1); hasNextOuter++)
                ;
        }

        for (; hasNextInner < system.throughput && poll(innerQueueL1); hasNextInner++)
            ;
        if (hasNextInner < system.throughput && innerQueueL2.peek() != null) {
            ActorMessage<?> message = null;
            for (int j = 0; j < system.getQueueSize() && (message = innerQueueL2.poll()) != null; j++)
                innerQueueL1.offer(message);

            for (; hasNextInner < system.throughput && poll(innerQueueL1); hasNextInner++)
                ;
        }

        if (hasNextInner == 0 && hasNextOuter == 0 && hasNextServer == 0 && !hasNextPriority
                && !hasNextDirective) {
            idle++;
            if (idle > system.idle) {
                idle = 0;
                if (system.threadMode == ActorThreadMode.PARK) {
                    if (newMessage.compareAndSet(true, false))
                        LockSupport.park(this);
                } else if (system.threadMode == ActorThreadMode.SLEEP) {
                    try {
                        sleep(system.sleepTime);
                    } catch (InterruptedException e) {
                        interrupt();
                    }
                } else
                    yield();
            }
        } else
            idle = 0;
    }
}

From source file:LinkedTransferQueue.java

/**
 * Spins/yields/blocks until node s is matched or caller gives up.
 *
 * @param s the waiting node/*from   w ww.ja  v a 2s.com*/
 * @param pred the predecessor of s, or s itself if it has no
 * predecessor, or null if unknown (the null case does not occur
 * in any current calls but may in possible future extensions)
 * @param e the comparison value for checking match
 * @param timed if true, wait only until timeout elapses
 * @param nanos timeout in nanosecs, used only if timed is true
 * @return matched item, or e if unmatched on interrupt or timeout
 */
private E awaitMatch(Node s, Node pred, E e, boolean timed, long nanos) {
    long lastTime = timed ? System.nanoTime() : 0L;
    Thread w = Thread.currentThread();
    int spins = -1; // initialized after first item and cancel checks
    ThreadLocalRandom randomYields = null; // bound if needed

    for (;;) {
        Object item = s.item;
        if (item != e) { // matched
            assert item != s;
            s.forgetContents(); // avoid garbage
            return this.<E>cast(item);
        }
        if ((w.isInterrupted() || (timed && nanos <= 0)) && s.casItem(e, s)) { // cancel
            unsplice(pred, s);
            return e;
        }

        if (spins < 0) { // establish spins at/near front
            if ((spins = spinsFor(pred, s.isData)) > 0)
                randomYields = ThreadLocalRandom.current();
        } else if (spins > 0) { // spin
            --spins;
            if (randomYields.nextInt(CHAINED_SPINS) == 0)
                Thread.yield(); // occasionally yield
        } else if (s.waiter == null) {
            s.waiter = w; // request unpark then recheck
        } else if (timed) {
            long now = System.nanoTime();
            if ((nanos -= now - lastTime) > 0)
                LockSupport.parkNanos(this, nanos);
            lastTime = now;
        } else {
            LockSupport.park(this);
        }
    }
}