close
public class WorkQueue {
   private final int nThreads;
   private final PoolWorker[] threads;
   private final LinkedList queue;

   public WorkQueue(int nThreads) {
       this.nThreads = nThreads;
       queue = new LinkedList();
       threads = new PoolWorker[nThreads];

       for (int i=0; i < nThreads; i++) {
           threads[i] = new PoolWorker();
           threads[i].start();
       }
   }

   public void execute(Runnable r) {
       synchronized(queue) {
           queue.addLast(r);
           queue.notify();
       }
   }

   private class PoolWorker extends Thread {
       public void run() {
           Runnable r;

           while (true) {
               synchronized(queue) {
                   while (queue.isEmpty()) {
                       try {
                           queue.wait();
                       } catch (InterruptedException ignored) {
                       }
                   }

                   r = (Runnable) queue.removeFirst();
               }

               // If we don't catch RuntimeException,
               // the pool could leak threads
               try {
                   r.run();
               } catch (RuntimeException e) {
                   // You might want to log something here
               }
           }
       }
   }
}
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Forth 的頭像
    Forth

    不就是個blog

    Forth 發表在 痞客邦 留言(0) 人氣()