ThreadPool.java
上传用户:songled
上传日期:2022-07-14
资源大小:94k
文件大小:1k
源码类别:

进程与线程

开发平台:

Java

  1. // uses ObjectFIFO from chapter 18
  2. public class ThreadPool extends Object {
  3. private ObjectFIFO idleWorkers;
  4. private ThreadPoolWorker[] workerList;
  5. public ThreadPool(int numberOfThreads) {
  6. // make sure that it's at least one
  7. numberOfThreads = Math.max(1, numberOfThreads);
  8. idleWorkers = new ObjectFIFO(numberOfThreads);
  9. workerList = new ThreadPoolWorker[numberOfThreads];
  10. for ( int i = 0; i < workerList.length; i++ ) {
  11. workerList[i] = new ThreadPoolWorker(idleWorkers);
  12. }
  13. }
  14. public void execute(Runnable target) throws InterruptedException {
  15. // block (forever) until a worker is available
  16. ThreadPoolWorker worker = (ThreadPoolWorker) idleWorkers.remove();
  17. worker.process(target);
  18. }
  19. public void stopRequestIdleWorkers() {
  20. try {
  21. Object[] idle = idleWorkers.removeAll();
  22. for ( int i = 0; i < idle.length; i++ ) {
  23. ( (ThreadPoolWorker) idle[i] ).stopRequest();
  24. }
  25. } catch ( InterruptedException x ) {
  26. Thread.currentThread().interrupt(); // re-assert
  27. }
  28. }
  29. public void stopRequestAllWorkers() {
  30. // Stop the idle one's first since that won't interfere with anything
  31. // productive.
  32. stopRequestIdleWorkers();
  33. // give the idle workers a quick chance to die 
  34. try { Thread.sleep(250); } catch ( InterruptedException x ) { }
  35. // Step through the list of ALL workers that are still alive.
  36. for ( int i = 0; i < workerList.length; i++ ) {
  37. if ( workerList[i].isAlive() ) {
  38. workerList[i].stopRequest();
  39. }
  40. }
  41. }
  42. }