package logic; import logic.starter.LogicStarter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.TimeUnit; /** * Created by Dell on 2016/3/2. */ public class Worker extends Thread { private static final Logger logger = LoggerFactory.getLogger(Worker.class); public static Worker[] _workers; public volatile boolean _stop =false; private final BlockingQueue<IMHandler> _tasks = new LinkedBlockingDeque<>(); public static void dispatch(String userId, IMHandler handler) { int workId = getWorkId(userId); if(handler == null) logger.error("handler is null"); _workers[workId]._tasks.offer(handler); } @Override public void run() { while(!_stop) { IMHandler handler = null; try { handler = _tasks.poll(600, TimeUnit.MILLISECONDS); if(handler == null) continue; } catch (InterruptedException e) { logger.error("Caught Exception"); } try { assert handler != null; handler.excute(this); } catch (Exception e) { logger.error("Caught Exception"); } } } public static int getWorkId(String str) { return str.hashCode() % LogicStarter.workNum; } public static void startWorker(int workNum) { _workers = new Worker[workNum]; for(int i = 0; i < workNum; i++) { _workers[i] = new Worker(); _workers[i].start(); } } public static void stopWorkers() { for(int i = 0; i < LogicStarter.workNum; i++) { _workers[i]._stop = true; } } }