/** * Copyright (C) 2012 FuseSource, Inc. * http://fusesource.com * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.fusesource.hawtdispatch.internal.pool; import org.fusesource.hawtdispatch.Task; import org.fusesource.hawtdispatch.internal.NioManager; import org.fusesource.hawtdispatch.internal.ThreadDispatchQueue; import org.fusesource.hawtdispatch.internal.WorkerThread; import java.io.IOException; import java.util.concurrent.ConcurrentLinkedQueue; import static java.lang.String.format; /** */ public class SimpleThread extends WorkerThread { private SimplePool pool; private ThreadDispatchQueue threadQueue; private final NioManager nioManager; public SimpleThread(SimplePool pool) throws IOException { super(pool.group, pool.name); this.pool = pool; this.nioManager = new NioManager(); this.threadQueue = new ThreadDispatchQueue(pool.globalQueue, this); } @Override public ThreadDispatchQueue getDispatchQueue() { return threadQueue; } @Override public void unpark() { nioManager.wakeupIfSelecting(); } @Override public NioManager getNioManager() { return nioManager; } @Override public void run() { debug("run start"); try { ConcurrentLinkedQueue<Task> sharedQueue = pool.tasks; while(!pool.shutdown) { Task task = threadQueue.poll(); if( task==null ) { task = sharedQueue.poll(); if( task==null ) { task = threadQueue.getSourceQueue().poll(); } } if( task == null ) { pool.park(this); } else { task.run(); } } } finally { debug("run end"); } } public static final boolean DEBUG = false; protected void debug(String str, Object... args) { if (DEBUG) { System.out.println(format("[DEBUG] SimpleThread %s: %s", getName(), format(str, args))); } } protected void debug(Throwable thrown, String str, Object... args) { if (DEBUG) { if (str != null) { debug(str, args); } if (thrown != null) { thrown.printStackTrace(); } } } }