Пример #1
1
  /**
   * 鍒嗘淳宸ヤ綔
   *
   * @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();
          }
        }
      }
    }
  }
Пример #2
0
  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();
   }
 }
Пример #4
0
 /** 鍚戠嚎绋嬫睜娣诲姞鏍煎鐨勭嚎绋� */
 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());
   }
 }
Пример #6
0
  /**
   * 妫�娴嬬嚎绋嬫睜涓殑绾跨▼鏄惁閮藉浜庣┖闂茬姸鎬�
   *
   * @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;
  }
Пример #7
0
 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;
 }
Пример #8
0
  /** 娓呯┖绾跨▼姹� */
  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);
   }
 }
Пример #10
0
 /**
  * * 鍒濆鍖栫嚎绋嬫睜
  *
  * @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();
       }
     }
   }
 }
Пример #11
0
  /** 纭繚绾跨▼姹犲凡缁忓垵濮嬪寲 */
  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));
 }
Пример #13
0
 private void releaseAllFreeThread() {
   while (pool.size() > 0) {
     WorkThread workThread = pool.remove();
     workThread.terminate();
   }
 }