使用PriorityBlockingQueue进行任务按优先级同步执行,摘自Think in Java

from: http://blog.csdn.net/forever_crying/article/details/8071014

  
  
  
  
  1. package concurrency;   
  2.    
  3. import java.util.ArrayList;   
  4. import java.util.List;   
  5. import java.util.Queue;   
  6. import java.util.Random;   
  7. import java.util.concurrent.ExecutorService;   
  8. import java.util.concurrent.Executors;   
  9. import java.util.concurrent.PriorityBlockingQueue;   
  10. import java.util.concurrent.TimeUnit;   
  11.    
  12.    
  13. class PrioritizedTask implements Runnable, Comparable<PrioritizedTask>   
  14. {   
  15.     private Random rand = new Random(47);   
  16.     private static int counter = 0;   
  17.     private final int id = counter++;   
  18.     private final int priority;   
  19.        
  20.     protected static List<PrioritizedTask> sequence = new ArrayList<PrioritizedTask>();   
  21.        
  22.     public PrioritizedTask(int priority)    
  23.     {   
  24.         this.priority = priority;   
  25.         sequence.add(this);   
  26.     }   
  27.        
  28.     @Override   
  29.     public int compareTo(PrioritizedTask o) {   
  30.         //复写此方法进行任务执行优先级排序   
  31. //      return priority < o.priority ? 1 :   
  32. //          (priority > o.priority ? -1 : 0);   
  33.         if(priority < o.priority)   
  34.         {   
  35.             return -1;   
  36.         }else   
  37.         {   
  38.             if(priority > o.priority)   
  39.             {   
  40.                 return 1;   
  41.             }else   
  42.             {   
  43.                 return 0;   
  44.             }   
  45.         }   
  46.     }   
  47.    
  48.     @Override   
  49.     public void run() {   
  50.         //执行任务代码..   
  51.         try {   
  52.             TimeUnit.MILLISECONDS.sleep(rand.nextInt(250));   
  53.         } catch (InterruptedException e) {   
  54.                
  55.         }   
  56.         System.out.println(this);   
  57.     }   
  58.        
  59.     @Override   
  60.     public String toString() {   
  61.         return String.format("[%1$-3d]", priority) + " Task id : " + id;   
  62.     }   
  63.        
  64.     public String summary()   
  65.     {   
  66.         return "( Task id : " + id + " _priority : " + priority + ")";   
  67.     }   
  68.        
  69.     /**  
  70.      * 结束所有任务  
  71.      */   
  72.     public static class EndSentinel extends PrioritizedTask   
  73.     {   
  74.         private ExecutorService exec;   
  75.         public EndSentinel(ExecutorService e) {   
  76.             super(Integer.MAX_VALUE);   
  77.             exec = e;   
  78.         }   
  79.            
  80.         public void run()   
  81.         {   
  82.             int count = 0;   
  83.             for(PrioritizedTask pt : sequence)   
  84.             {   
  85.                 System.out.print(pt.summary());   
  86.                 if(++count % 5 == 0)   
  87.                 {   
  88.                     System.out.println();   
  89.                 }   
  90.             }   
  91.             System.out.println();   
  92.             System.out.println(this + "Calling shutdownNow()");   
  93.             exec.shutdownNow();   
  94.         }   
  95.     }   
  96. }   
  97.    
  98. /**  
  99.  * 制造一系列任务,分配任务优先级  
  100.  */   
  101. class PrioritizedTaskProducer implements Runnable   
  102. {   
  103.     private Random rand = new Random(47);   
  104.     private Queue<Runnable> queue;   
  105.     private ExecutorService exec;   
  106.        
  107.     public PrioritizedTaskProducer(Queue<Runnable> q, ExecutorService e)    
  108.     {   
  109.         queue = q;   
  110.         exec = e;   
  111.     }   
  112.        
  113.     @Override   
  114.     public void run() {   
  115.            
  116.         for(int i = 0; i < 20; i++)   
  117.         {   
  118.             queue.add(new PrioritizedTask(rand.nextInt(10)));   
  119.             Thread.yield();   
  120.         }   
  121.            
  122.         try {   
  123.             for (int i = 0; i < 10; i++) {   
  124.                 TimeUnit.MILLISECONDS.sleep(250);   
  125.                 queue.add(new PrioritizedTask(10));   
  126.             }   
  127.                
  128.             for(int i = 0; i < 10; i++)   
  129.             {   
  130.                 queue.add(new PrioritizedTask(i));   
  131.             }   
  132.                
  133.             queue.add(new PrioritizedTask.EndSentinel(exec));   
  134.                
  135.         } catch (InterruptedException e) {   
  136.                
  137.         }   
  138.            
  139.         System.out.println("Finished PrioritizedTaskProducer");   
  140.     }   
  141. }   
  142.    
  143.    
  144. /**  
  145.  * 使用PriorityBlockingQueue进行任务按优先级同步执行  
  146.  */   
  147. class PrioritizedTaskConsumer implements Runnable   
  148. {   
  149.     private PriorityBlockingQueue<Runnable> q;   
  150.     public PrioritizedTaskConsumer(PriorityBlockingQueue<Runnable> q)   
  151.     {   
  152.         this.q = q;   
  153.     }   
  154.    
  155.     @Override   
  156.     public void run() {   
  157.         try    
  158.         {   
  159.             while (!Thread.interrupted())    
  160.             {   
  161.                 q.take().run();   
  162.             }   
  163.         } catch (InterruptedException e)    
  164.         {   
  165.         }   
  166.         System.out.println("Finished PrioritizedTaskConsumer");   
  167.     }   
  168.        
  169. }   
  170. public class PriorityBlockingQueueDemo {   
  171.        
  172.     public static void main(String args[])   
  173.     {   
  174.         ExecutorService exec = Executors.newCachedThreadPool();   
  175.         PriorityBlockingQueue<Runnable> queue = new PriorityBlockingQueue<Runnable>();   
  176.            
  177.         exec.execute(new PrioritizedTaskProducer(queue, exec));   
  178.         try {   
  179.             TimeUnit.MILLISECONDS.sleep(250);   
  180.         } catch (InterruptedException e) {   
  181.         }   
  182.         exec.execute(new PrioritizedTaskConsumer(queue));   
  183.     }   
  184. }  

 

你可能感兴趣的:(java,任务,优先级)