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

进程与线程

开发平台:

Java

  1. // uses class ObjectFIFO from chapter 18
  2. public class ThreadPoolWorker extends Object {
  3. private static int nextWorkerID = 0;
  4. private ObjectFIFO idleWorkers;
  5. private int workerID;
  6. private ObjectFIFO handoffBox;
  7. private Thread internalThread;
  8. private volatile boolean noStopRequested;
  9. public ThreadPoolWorker(ObjectFIFO idleWorkers) {
  10. this.idleWorkers = idleWorkers;
  11. workerID = getNextWorkerID();
  12. handoffBox = new ObjectFIFO(1); // only one slot
  13. // just before returning, the thread should be created and started.
  14. noStopRequested = true;
  15. Runnable r = new Runnable() {
  16. public void run() {
  17. try {
  18. runWork();
  19. } catch ( Exception x ) {
  20. // in case ANY exception slips through
  21. x.printStackTrace(); 
  22. }
  23. }
  24. };
  25. internalThread = new Thread(r);
  26. internalThread.start();
  27. }
  28. public static synchronized int getNextWorkerID() { 
  29. // notice: synchronized at the class level to ensure uniqueness
  30. int id = nextWorkerID;
  31. nextWorkerID++;
  32. return id;
  33. }
  34. public void process(Runnable target) throws InterruptedException {
  35. handoffBox.add(target);
  36. }
  37. private void runWork() {
  38. while ( noStopRequested ) {
  39. try {
  40. System.out.println("workerID=" + workerID + 
  41. ", ready for work");
  42. // Worker is ready work. This will never block since the
  43. // idleWorker FIFO queue has enough capacity for all of
  44. // the workers.
  45. idleWorkers.add(this);
  46. // wait here until the server puts a request into the box
  47. Runnable r = (Runnable) handoffBox.remove();
  48. System.out.println("workerID=" + workerID + 
  49. ", starting execution of new Runnable: " + r);
  50. runIt(r); // catches all exceptions
  51. } catch ( InterruptedException x ) {
  52. Thread.currentThread().interrupt(); // re-assert
  53. }
  54. }
  55. }
  56. private void runIt(Runnable r) {
  57. try {
  58. r.run();
  59. } catch ( Exception runex ) {
  60. // catch any and all exceptions 
  61. System.err.println("Uncaught exception fell through from run()");
  62. runex.printStackTrace();
  63. } finally {
  64. // Clear the interrupted flag (in case it comes back set)
  65. // so that if the loop goes again, the 
  66. // handoffBox.remove() does not mistakenly throw
  67. // an InterruptedException.
  68. Thread.interrupted();
  69. }
  70. }
  71. public void stopRequest() {
  72. System.out.println("workerID=" + workerID + 
  73. ", stopRequest() received.");
  74. noStopRequested = false;
  75. internalThread.interrupt();
  76. }
  77. public boolean isAlive() {
  78. return internalThread.isAlive();
  79. }
  80. }