zoukankan      html  css  js  c++  java
  • 线程池中的线程的排序问题

     1 package org.zln.thread.poolqueue;
     2 
     3 import org.slf4j.Logger;
     4 import org.slf4j.LoggerFactory;
     5 
     6 import java.util.Comparator;
     7 import java.util.UUID;
     8 import java.util.concurrent.*;
     9 
    10 /**
    11  * 线程池中的线程的排序问题
    12  * Created by sherry on 16/11/4.
    13  */
    14 public class StringThread {
    15 
    16     /**
    17      * 日志
    18      */
    19     private static Logger logger = LoggerFactory.getLogger(StringThread.class);
    20 
    21     public static void main(String[] args) {
    22         ExecutorService executorService = new StringExecutorPool(10).getExecutorService();
    23         for (int i = 0; i < 100; i++) {
    24             logger.debug(String.valueOf(i));
    25             executorService.execute(new StringHandler(System.nanoTime()));
    26         }
    27         executorService.shutdown();
    28         logger.debug("停止");
    29     }
    30 
    31 
    32 }
    33 
    34 /**
    35  * 任务类
    36  */
    37 class StringHandler implements Runnable {
    38 
    39     public long time;
    40 
    41     public StringHandler(long time) {
    42         this.time = time;
    43     }
    44 
    45     @Override
    46     public void run() {
    47         System.out.println(Thread.currentThread().getName() + ":" + UUID.randomUUID().toString());
    48     }
    49 }
    50 
    51 /**
    52  * 线程池
    53  */
    54 class StringExecutorPool {
    55     private int poolSize;
    56     private BlockingQueue<Runnable> blockingQueue;
    57     private ExecutorService executorService;
    58 
    59     public StringExecutorPool(int poolSize) {
    60         this.poolSize = poolSize;
    61         blockingQueue = new PriorityBlockingQueue<>(100, new Comparator<Runnable>() {
    62             @Override
    63             public int compare(Runnable o1, Runnable o2) {
    64                 int res = o1.hashCode() - o2.hashCode();
    65                 if (res == 0){
    66                     StringHandler stringHandler1 = (StringHandler) o1;
    67                     StringHandler stringHandler2 = (StringHandler) o2;
    68                     res = (int) (stringHandler1.time - stringHandler2.time);
    69                 }
    70                 if (res >0 ){
    71                     System.out.println("往后排");
    72                 }else if (res < 0){
    73                     System.out.println("往前排");
    74                 }else{
    75                     System.out.println("排不出");
    76                 }
    77                 return res;
    78             }
    79 
    80         });
    81 
    82         executorService = new ThreadPoolExecutor(poolSize, poolSize,
    83                 0L, TimeUnit.MILLISECONDS,
    84                 blockingQueue);
    85     }
    86 
    87     public ExecutorService getExecutorService() {
    88         return executorService;
    89     }
    90 }
  • 相关阅读:
    在同步块中修改指向同步对象的引用
    算法学习记录3 插入排序
    算法学习记录2 归并排序
    算法学习记录1 快速排序
    CE学习记录1
    jenkins 学习记录2
    jenkins 学习记录1
    扩展 jquery miniui 组件实现自动查询数据
    java对象与XML相互转化
    分享公司缓存的用法
  • 原文地址:https://www.cnblogs.com/sherrykid/p/6031932.html
Copyright © 2011-2022 走看看