/** * 鍒嗘淳宸ヤ綔 * * @param state */ private static void dispatchWorkItem() { WorkThread wt = null; while (true) { WorkTaskData data = null; if (quequeWorkTaskDatas.size() > 0) { data = (WorkTaskData) quequeWorkTaskDatas.firstElement(); quequeWorkTaskDatas.removeElement(quequeWorkTaskDatas.firstElement()); while (true) { int index = -1; int size = pooledWorkThreads.size(); for (int i = 0; i < size; i++) { if (((WorkThread) pooledWorkThreads.elementAt(i)).IsIdle()) { index = i; break; } } if (index > -1) { for (int i = 0; i < size; i++) { // 宸茬粡鍚姩鐨勭嚎绋嬭缃瓑绾т负鏈�浣庣骇 if (!((WorkThread) pooledWorkThreads.elementAt(i)).IsIdle()) { ((WorkThread) pooledWorkThreads.elementAt(i)).setPriority(WorkThread.MIN_PRIORITY); } } wt = (WorkThread) pooledWorkThreads.elementAt(index); wt.setPriority(WorkThread.MAX_PRIORITY); // 鏈�鍚庝竴涓惎鍔ㄧ殑璁剧疆涓洪珮绾� wt.setWorkTaskData(data); if (index <= DEFAULT_MAX_WORKTHREADS && index + 1 < pooledWorkThreads.size()) // 鍒ゆ柇鏄惁鍙堝彲浠ュ洖鏀剁殑鏉′欢 { recycleThread(); } break; } else { addThreadToPooled(); // 绾跨▼涓嶅鐢ㄦ坊鍔犳柊绾跨▼ } } try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock) { try { if (quequeWorkTaskDatas.size() == 0) { isWating = true; lock.wait(); } } catch (InterruptedException e) { e.printStackTrace(); } } } } }
public void stop() { state = State.STOPPING; for (int i = 0; i < works.size(); i++) { msgQueue.offer(this.killThread); } synchronized (works) { for (WorkThread work : works) { work.interrupt(); } } int cnt = 100; while (cnt-- > 0 && works.size() > 0) { Thread.yield(); try { Thread.sleep(50); } catch (Exception e) { } if (cnt < 20) continue; } if (log.isDebugEnabled()) log.debug("Thread Pool【" + name + "】Stop。,Dead thread count=" + works.size()); // 线程池停止,僵死线程数 works.clear(); // 把AsyncService数据回收 for (IMessage msg : this.asycService.revokeEventQueue()) msgQueue.offer(msg); state = State.STOPPED; }
public void releaseFreeThreads() { try { lock.lock(); while (pool.size() > 0 && pool.size() + runSize > coreSize) { WorkThread workThread = pool.getLast(); if (System.currentTimeMillis() - workThread.lastStartTime > idleTimeout) { logger.debug( "释放线程:" + workThread + " index: " + workThread.index + " lastExecuteTime: " + workThread.lastStartTime); // debug.log("释放线程:" + workThread + " index: " + workThread.index + " lastExecuteTime: // " + workThread.lastStartTime); workThread.terminate(); pool.removeLast(); } else { // 所有线程前移 break; } } } finally { lock.unlock(); } }
/** 鍚戠嚎绋嬫睜娣诲姞鏍煎鐨勭嚎绋� */ private static void addThreadToPooled() { WorkThread wt = new WorkThread(); wt.setPriority(Thread.MIN_PRIORITY); wt.start(); pooledWorkThreads.addElement(wt); // System.out.println("娣诲姞绾跨▼"); }
private void openThread(int toOpen) { logger.debug("开启线程数量:" + toOpen); // debug.log("开启线程数量:" + toOpen); for (int i = 0; i < toOpen; i++) { WorkThread workThread = new WorkThread(this, (runSize + pool.size())); pool.addFirst(workThread); logger.debug("创建线程 " + workThread.toString()); // debug.log("创建线程 " + workThread.toString()); } }
/** * 妫�娴嬬嚎绋嬫睜涓殑绾跨▼鏄惁閮藉浜庣┖闂茬姸鎬� * * @return */ private static boolean isIdle() { if (quequeWorkTaskDatas.size() > 0) return false; for (int i = 0; i < maxWorkThreads; i++) { WorkThread wt = (WorkThread) pooledWorkThreads.elementAt(i); if (!wt.IsIdle()) return false; } return true; }
private Object getval(PluginRPort port) { WorkThread p = new WorkThread(ab); p.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { VM.println("Interrupted."); } Object o2 = p.obj; // VM.println("plupp " + o2); if (p.obj != null) { // p.stop(); } return o2; }
/** 娓呯┖绾跨▼姹� */ public static void Destroy() { while (!isIdle()) { try { Thread.sleep(0); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } for (int i = 0; i < maxWorkThreads; i++) { WorkThread wt = (WorkThread) pooledWorkThreads.elementAt(i); wt.exit(); } pooledWorkThreads.removeAllElements(); }
public void execute(Runnable runnable) { if (isStop()) { return; } WorkThread thread = findFreeWorkThread(); if (thread != null) { System.out.println( " 使用线程:" + thread.index + " 最后运行时间:" + new Timestamp(thread.lastStartTime) + " 正在运行的线程数:" + (runSize + pool.size())); thread.runTask(runnable); } else { System.out.println("出现等待线程"); addTask(runnable); } }
/** * * 鍒濆鍖栫嚎绋嬫睜 * * @param threads */ private static void resizeWorkThreads(int threads) { // System.out.println("threads:"+threads); if (threads > 0) { for (int i = 0; i < threads; i++) { WorkThread wt = new WorkThread(); wt.setPriority(Thread.MIN_PRIORITY); wt.start(); pooledWorkThreads.addElement(wt); } } else { for (int i = 0; i < 0 - threads; i++) { int count = pooledWorkThreads.size(); if (count > 0) { WorkThread wt = (WorkThread) pooledWorkThreads.elementAt(count - 1); pooledWorkThreads.removeElementAt(count - 1); while (!wt.IsIdle()) { try { Thread.sleep(0); } catch (InterruptedException e) { // TODO Auto-generated catch block // e.printStackTrace(); } } wt.exit(); } } } }
/** 纭繚绾跨▼姹犲凡缁忓垵濮嬪寲 */ static { if (!initialized) { pooledWorkThreads = new Vector(); quequeWorkTaskDatas = new Vector(); resizeWorkThreads(DEFAULT_MAX_WORKTHREADS); WorkTaskData data = new WorkTaskData( new WaitCallback() { public void execute(Object state) { dispatchWorkItem(); } }, null); innerThread = new WorkThread(); innerThread.setWorkTaskData(data); innerThread.start(); initialized = true; } }
/** * 主方法调用 * * @param args */ public static void main(String[] args) { List<Integer> dataList = new ArrayList<Integer>(); for (int i = 0; i < 12; i++) { dataList.add(i); } System.out.println("总数据集:" + dataList); long start = System.currentTimeMillis(); WorkThread[] workThreadArray = new WorkThread[4]; for (int i = 0; i < workThreadArray.length; i++) { workThreadArray[i] = new WorkThread("线程" + i, dataList.subList(i * 3, (i + 1) * 3)); workThreadArray[i].start(); } /*主线程希望等待所有的子线程都完成任务后汇总结果并展示出来*/ for (WorkThread aWorkThread : workThreadArray) { try { aWorkThread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("结果汇总:" + dataList); System.out.println("耗时:" + (System.currentTimeMillis() - start)); }
private void releaseAllFreeThread() { while (pool.size() > 0) { WorkThread workThread = pool.remove(); workThread.terminate(); } }