List of usage examples for java.util.concurrent.locks LockSupport park
public static void park(Object blocker)
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); } } }