使用ThreadLocal并且有线程池时要特别注意,ThreadLocal是以线程为key的,而线程池里面的线程是会被重新利用的,所以如果有使用线程池并且使用ThreadLocal来保存状态信息时要特别注意要每次初始化,否则同一个线程会用到之前线程的状态信息,代码见 http://www.macrohuang.com/blog/?p=34 其他:http://blog.csdn.net/comliu/article/details/3186778http://www.blogjava.net/j…
最近遇到一个比较隐蔽而又简单地问题,在使用ThreadLocal时发现出现多个线程中值串来串去,排查一番,确定问题为线程池的问题,线程池中的线程是会重复利用的,而ThreadLocal是用线程来做Key的所以在使用线程池的时候要特别注意ThreadLocal. ThreadLocal数据是在线程创建时绑定在线程上的, 所以解决方法是在使用数据之前调用remove() 移除掉之前的其他线程产生的数据 解决方法 重构remove方法 @Override public void remove() { …
线程池可以提供这种保障,一旦你的代码开始执行了,被分配来执行这个task的线程在执行完你的task之前不会做别的事情. 所以不用担心执行到一半被别的task改了 thread local 的变量. 由于线程重复使用所以你对thread local变量的修改都会保留下来 所以在使用前要把变量"重置"一下. 可以在每个task结尾做,也可以在开始做. 在结尾做的话需要放到finally里,确保执行 public final class Diary { // ... public stati…
1.线程池 创建线程需要时间.如果有不同的短任务要完成,就可以事先创建许多线程,在应完成这些任务时发出请求.这个线程数最好在需要更多线程时增加,在需要释放资源时减少.不需要自己创建这样一个列表.该列表有ThreadPool类托管.这个类会在需要时增减池中线程的线程数,直到最大的线程数.池中的最大线程数是可配置的.在四核CPU中,默认设置为1023个工作线程和1000个I/O线程.也可以指定在创建线程池时应立即启动的最小线程数,以及线程池中可用的最大线程数.如果有更多的作业要处理,线程池中线程的个…
在需要创建的线程很多,且都是比较小的线程的情况下,可以使用线程池(ThreadPool类).ThreadPool是一个静态方法,提供了对一个线程集合的操作,它会在线程数不足时增加线程,空闲线程数过多时释放资源. 1.ThreadPool简单应用 调用ThreadPool.QueueUserWorkItem()方法,传递一个WaitCallBack委托类型的方法,并把这个方分配给线程池中的线程.线程池是自动运行的,如果线程池还没有运行,就会创建一个线程池,并启动第一个线程.如果线程池己经在运行,且…
/* 线程池ThreadPool类会在需要时增减池中线程的线程数,直到最大的线程数.池中的最大线程数是可配置的. 在双核CPU中,默认设置为1023个工作线程和1000个I/O线程.也可以指定在创建线程池时应立即启动的最小线程数, 以及线程池,中可用的最大线程数.如果有更多的作业要处理,线程池中线程的个数也到了极限, 最新的作业就要排队,且必须等待线程完成其任务. */ //下面这个方法是一个符合WaitCallBack委托的方法: static void WaitCallBackMethod(…
线程池 (本章节中样例都是用 VS2010 编译调试的) 线程池编写必须在 Windows Vista 操作系统(以及以上版本号的操作系统)下,且 C++ 编译器版本号至少是 VS2008 线程池的功能 以异步的方式来调用一个函数 每隔一段时间调用一个函数 当内核对象触发的时候调用一个函数 当异步 I/O 请求完毕的时候调用一个函数 注意 当一个进程初始化的时候,它并没有不论什么与线程池的开销.可是,一旦调用了新的线程池函数,系统就会为进程对应的内核资源,当中的一些资源在进程终止之前都将一直存在…
1.需求背景 创建线程需要时间.如果有不同的小任务完成,就可以事先创建许多线程,在应完成这些任务时发出请求.这个线程数最好在需要更多的线程时增加,在需要释放资源时减少.   2.线程池出场 不需要自己创建这样一个列表.该列表由ThreadPool类托管.这个类会在需要时增减池中线程的线程数,直到最大的线程数.池中的最大线程数是可配置的. 在双核CPU中,默认设置为1023个工作线程和1000个I/O线程.四核CPU中,默认设置为2047个工作线程和1000个I/O线程. 也可以指定在创建线程池时…
转自:http://blog.csdn.net/u013142781/article/details/51387749 1.为什么要使用线程池 在Java中,如果每个请求到达就创建一个新线程,开销是相当大的.在实际使用中,服务器在创建和销毁线程上花费的时间和消耗的系统资源都相当大,甚至可能要比在处理实际的用户请求的时间和资源要多的多.除了创建和销毁线程的开销之外,活动的线程也需要消耗系统资源.如果在一个jvm里创建太多的线程,可能会使系统由于过度消耗内存或“切换过度”而导致系统资源不足.为了防止…
1  线程池的概念 许多应用程序使用多个线程,但这些线程经常在休眠状态中耗费大量的时间来等待事件发生.其他线程可能进入休眠状态,并且仅定期被唤醒以轮询更改或更新状态信息,然后再次进入休眠状态.为了简化对这些线程的管理,.NET框架为每一个进程提供了一个线程池,使应用程序能够根据需要来有效地利用多个线程.一个线程监视排到线程池的若干个等待操作的状态.当一个等待操作完成时,线程池中的一个辅助线程就会执行对应的回调函数.线程池中的线程由系统进行管理,程序员不需要费力于线程管理,可以集中精力处理应用程序…