线程池中的线程的排序问题

 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 }
时间: 2024-10-20 10:44:45

线程池中的线程的排序问题的相关文章

Java线程池中线程的状态简介

首先明确一下线程在JVM中的各个状态(JavaCore文件中) 1.死锁,Deadlock(重点关注) 2.执行中,Runnable(重点关注) 3.等待资源,Waiting on condition(重点关注) 4.等待监控器检查资源,Waiting on monitor(eg:如果使用System.out.println等需要分配计算机资源的时候线程会如此等待,主要还需看堆栈) 5.暂停,Suspended 6.对象等待中,Object.wait() 7.阻塞,Blocked(重点关注) 8

通过实验研究“线程池中线程数目的变化规律” --- 下有不错的线程池使用 原理 总结

通过实验研究“线程池中线程数目的变化规律” 自从看了老赵关于线程池的实验以后,我就想学着做一个类似的实验,验证自己的理解,现在终于做好了,请大家指正. 一般情况下我们都使用Thread类创建线程,因为通过Thread对象可以对线程进行灵活的控制.但创建线程和销毁线程代价不菲,过多的线程会消耗掉大量的内存和CPU资源,假如某段时间内突然爆发了100个短小的线程,创建和销毁这些线程就会消耗很多时间,可能比线程本身运行的时间还长.为了改善这种状况,.NET提供了一种称之为线程池(Thread Pool

深入浅出 Java Concurrency (33): 线程池 part 6 线程池的实现及原理 (1)[转]

线程池数据结构与线程构造方法 由于已经看到了ThreadPoolExecutor的源码,因此很容易就看到了ThreadPoolExecutor线程池的数据结构.图1描述了这种数据结构. 图1 ThreadPoolExecutor 数据结构 其实,即使没有上述图形描述ThreadPoolExecutor的数据结构,我们根据线程池的要求也很能够猜测出其数据结构出来. 线程池需要支持多个线程并发执行,因此有一个线程集合Collection<Thread>来执行线程任务: 涉及任务的异步执行,因此需要

线程池和异步线程

目录: 1 什么是CLR线程池? 2 简单介绍下线程池各个优点的实现细节 3 线程池ThreadPool的常用方法介绍 4 简单理解下异步线程 5 异步线程的工作过程和几个重要的元素 6 有必要简单介绍下Classic Async Pattern 和Event-based Async Pattern 7 异步线程的发展趋势以及.net4.5异步的简化 8 本章示例 自定义一个简单的线程池 Asp.net异步IHttpAsyncHandler示例 9 本章总结 1 什么是CLR线程池? 在上一章中

Java多线程系列--“JUC线程池”02之 线程池原理(一)

ThreadPoolExecutor简介 ThreadPoolExecutor是线程池类.对于线程池,可以通俗的将它理解为"存放一定数量线程的一个线程集合.线程池允许同时运行的线程数量就是线程池的容量:当添加到线程池中的线程超过它的容量时,会有一部分线程阻塞等待.线程池会通过相应的调度策略和拒绝策略,对添加到线程池中的线程进行管理." ThreadPoolExecutor数据结构 ThreadPoolExecutor的数据结构如下图所示: 各个数据在ThreadPoolExecutor

使用线程池与专用线程

高效线程使用圣典 严格来讲,线程的系统开销很大.系统必须为线程分配并初始化一个线程内核对象,还必须为每个线程保留1MB的地址空间(按需提交)用于线程的用 户模式堆栈,分配12KB左右的地址空间用于线程的内核模式堆栈.然后,紧接着线程创建后,Windows调用进程中每个DLL都有的一个函数来通知进程 中所有的DLL操作系统创建了一个新的线程.同样,销毁一个线程的开销也不小:进程中的每个DLL都要接收一个关于线程即将"死亡"的通知,而且内核对象 及堆栈还需释放. 如果一台计算机中只有一个C

Android 线程池来管理线程

网上讲了很多的关于线程池的例子.其实在我们实际应用中,譬如说,一个应用的线程是怎样来管理的,我们就可以说,我们可以使用线程池来管理线程. eg: class DianLiang1 implements Runnable { @Override punlic void Run{ system.println("*************111111111111111111111****************"); } } class DianLiang2 implements Runn

可动态增减的线程池,主线程accept——基于UNP代码修改

可动态增减的线程池,主线程accept——基于UNP代码修改 1.说明 线程池基于一个区间动态变化,在客户连接过多线程不够用时,动态增加一定数量的线程.在线程闲置数量多于一半时,动态减小线程数量到一个基准线. 这个例子模式为:半同步/半异步(half-sync/half-async) 2.代码相关说明 代码基于UNP的库函数,要想运行必须先安装相应库. 3.代码 #include "unpthread.h" #include <queue> #include <lis

线程池的各个线程accept——基于UNP代码

线程池的各个线程accept——基于UNP代码 1.说明 预创建一个线程池,线程池中各个线程accept.主线程不做什么. 这是Leader/Follower领导者/跟随者模式 2.代码 代码基于UNP的库函数 #include "unpthread.h" //线程信息 typedef struct { pthread_t thread_tid; //thread ID long thread_count; //connections handled } Thread; //线程结构数