public void setTargetQueue(DispatchQueue next) { super.setTargetQueue(next); // The target thread queue might be different. Optimize by switching the selector to it. // Do we need to switch selector threads? DispatchQueue queue = next; while( queue.getQueueType()!=THREAD_QUEUE && queue.getTargetQueue() !=null ) { queue = queue.getTargetQueue(); } if( queue.getQueueType()==THREAD_QUEUE && queue!=selectorQueue ) { DispatchQueue previous = selectorQueue; final DispatchQueue newQueue = queue; debug("Switching to " + newQueue.getLabel()); selectorQueue = queue; if( previous!=null ) { previous.execute(new Task(){ public void run() { key_cancel(); register_on(newQueue); } }); } else { register_on(newQueue); } } }
static private DispatchQueue pickThreadQueue(HawtDispatcher dispatcher, DispatchQueue targetQueue) { // Try to select a thread queue associated /w the target if available.. DispatchQueue selectorQueue = targetQueue; while( selectorQueue.getQueueType()!=THREAD_QUEUE && selectorQueue.getTargetQueue() !=null ) { selectorQueue = selectorQueue.getTargetQueue(); } // otherwise.. pick the thread queue with the fewest registered selection // keys. if( selectorQueue.getQueueType()!=THREAD_QUEUE ) { WorkerThread[] threads = dispatcher.DEFAULT_QUEUE.workers.getThreads(); WorkerThread min = threads[0]; int minSize = min.getNioManager().getRegisteredKeyCount(); for( int i=1; i < threads.length; i++) { int s = threads[i].getNioManager().getRegisteredKeyCount(); if( s < minSize ) { minSize = s; min = threads[i]; } } selectorQueue = min.getDispatchQueue(); } return selectorQueue; }